scroll-view — 实现与 components.md 对照

对照基准:

  • 规格:docs/refs/components.md#scroll-view
  • AI 限制:仅横向滚动(scroll-xscroll-y / refresher / enhanced 等 ⏭️
  • 实现:
    • packages/flexui-frontend/src/components/scroll-view/scroll-view.ts
    • flexui-engine/driver/js/packages/flexui-backend/src/adapters/scroll-view-adapter.ts
    • flexui-engine/.../native-backend/NativeBackendElement.tsscroll-into-view
    • C++:framework/ohos/.../components/scroll_view.cc / scroll_view.h
    • Demo:demos/ascf-ai-demo/.../scroll-view-demo/

模板使用 kebab-case(如 scroll-x),组件 propertiescamelCase(如 scrollX);adapter / host attribute 仅 kebab-case,不双写 camelCase 别名。

包名说明:内置组件源码在 @openflexui/frontendpackages/flexui-frontend);原生 adapter 在 flexui-backend(原 hippy-ascf / flexui-ascf 路径已迁移)。


结论摘要

维度 结论
规格纳入(✅) scroll-xscroll-leftupper-thresholdlower-thresholdscroll-into-viewscroll-with-animationshow-scrollbar + bindscroll / bindscrolltoupper / bindscrolltolower已声明并贯通
规格「⚠️ 按需」 scroll-into-view-offsetenable-passive未声明
规格「⚠️ 待映射」 clip未映射(ArkUI 默认裁剪,属性不可控)
规格「⏭️」 scroll-y / scroll-top / refresher 全套 / enhanced / WebView 项 → 未声明、未实现(与 AI 一致)
默认值 scroll-x=falseshow-scrollbar=true(C++ 构造已对齐)、threshold 默认 50
Demo 正向 + 异常(错类型 / 字符串 "false" 的 Boolean !! 语义)

属性对照

通用(可交付 / 横向)

属性(模板) 类型 规格默认 components.md 当前实现 说明
scroll-x boolean false ✅ 纳入 scrollXhorizontal optionalTypes:[String] 保留 "false"!! 后仍横滑。NativeBackendElement / adapter 强制 horizontal(仅 false/0/'0' 关闭)
scroll-left number/string ✅ 纳入 ✅ → contentOffset.xScrollTo scroll-with-animation 同批在 OnSetPropsEnd 应用
upper-threshold number/string 50 ✅ 纳入(横向) ✅ → upperThreshold OnScroll / OnReachStartscrolltoupper
lower-threshold number/string 50 ✅ 纳入(横向) ✅ → lowerThreshold scrolltolower
scroll-into-view string ✅ 纳入(横向) 见下方贯通说明
scroll-into-view-offset number 0 ⚠️ 按需 ❌ 未声明
scroll-with-animation boolean false ✅ 纳入 ✅ → scrollWithAnimation 配合 contentOffset / scrollToPosition
enable-passive boolean false ⚠️ 按需 ❌ 未声明
show-scrollbar boolean true ✅ 纳入 ✅ → showScrollIndicator C++ 构造默认 true;见 Boolean 语义说明
bindscroll event scroll detail 含 scrollLeft
bindscrolltoupper event scrolltoupper direction: left/top
bindscrolltolower event scrolltolower direction: right/bottom

通用(AI 冲突 — 不声明)

属性 components.md 当前实现
scroll-y / scroll-top ⏭️ AI 冲突 ❌ 未声明;adapter 不映射
enable-back-to-top ⏭️ AI 冲突
refresher-* / bindrefresher* ⏭️ AI 冲突
bounces / fast-deceleration / binddrag* ⏭️ 收紧

Skyline

属性 规格默认 components.md 当前实现
clip true ⚠️ 待映射 ❌ 无 adapter/C++ 映射;ArkUI 默认裁剪
type / nested·list / worklet / two-level refresher 等 ⏭️ 不纳入

WebView

属性 components.md 当前实现
enable-flex / enhanced / paging-enabled / using-sticky ⏭️ WebView

事件对照

事件 components.md 当前实现 detail / 备注
bindscroll scrollLeft / scrollTop / scrollWidth / scrollHeight
bindscrolltoupper direction(横向为 left
bindscrolltolower direction(横向为 right
bindtap (基础) tapclick

实现要点

  1. TS 仅声明 AI 交付属性_syncScrollStyles:开 scroll-xoverflow-x:auto;未开则保留 overflow-y:auto(页级纵向,不声明 scroll-y)。
  2. show-scrollbar:组件层按 Boolean !! 写入 host;adapter → showScrollIndicator。字符串 "false" 经属性系统 !! 后为 true(仍显示滚动条)——异常用例预期。勿在 defaultNativeProps 写死 showScrollIndicator:true(与 removeAttribute 冲突)。
  3. scroll-into-view:原生无 DOM scrollIntoViewNativeBackendElement 按子节点 id 累加主轴尺寸 → contentOffset,并在 setAttributescrollToPositioncallUIFunction)。
  4. scroll-left + 动画:adapter contentOffset + C++ scrollWithAnimation_;Demo 禁止bind:scroll 回写同一 scroll-left 绑定字段(否则出现 200→0)。
  5. 验证必须重打 jsfwkbuild.sh 已含 build-jsfwk;仅编 demo/HAP 时 adapter / NativeBackend 改动不会进设备。

Demo 覆盖(scroll-view-demo

类型 覆盖项
正向 scroll-x 默认 / true;受控 scroll-leftscroll-into-view;threshold 边界事件;scroll-with-animationshow-scrollbar=false
异常 scroll-x="false" 字符串;upper-threshold="abc" / trueshow-scrollbar="false" 字符串(应仍显示条);scroll-left="abc"

complex 页顶部 Tab:show-scrollbar="{{false}}"


默认值审计(与实现一致)

属性 规格默认 TS / adapter / C++ 状态
scroll-x false TS false;未映射时 C++ horizontal=false
show-scrollbar true TS true;C++ SetShowScrollIndicator(true)
upper/lower-threshold 50 TS + C++ 50
scroll-with-animation false TS + C++ false

参考路径

角色 路径
交付规格 components.md#scroll-view
对照本文 scroll-view-vs-components.md
组件定义 packages/flexui-frontend/src/components/scroll-view/scroll-view.ts
Native 适配 flexui-engine/driver/js/packages/flexui-backend/src/adapters/scroll-view-adapter.ts
into-view .../native-backend/NativeBackendElement.ts
C++ .../renderer/native/src/components/scroll_view.cc
Demo demos/ascf-ai-demo/ascf/ascf_src/skills/apidemos/components/components/scroll-view-demo/
Skill .claude/skills/flexui-ascf-builtin-component/SKILL.md