对照基准:
- 规格:docs/refs/components.md#scroll-view
- AI 限制:仅横向滚动(
scroll-x);scroll-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.ts(scroll-into-view)
- C++:
framework/ohos/.../components/scroll_view.cc / scroll_view.h
- Demo:
demos/ascf-ai-demo/.../scroll-view-demo/
模板使用 kebab-case(如 scroll-x),组件 properties 为 camelCase(如 scrollX);adapter / host attribute 仅 kebab-case,不双写 camelCase 别名。
包名说明:内置组件源码在 @openflexui/frontend(packages/flexui-frontend);原生 adapter 在 flexui-backend(原 hippy-ascf / flexui-ascf 路径已迁移)。
结论摘要
| 维度 |
结论 |
| 规格纳入(✅) |
scroll-x、scroll-left、upper-threshold、lower-threshold、scroll-into-view、scroll-with-animation、show-scrollbar + bindscroll / bindscrolltoupper / bindscrolltolower → 已声明并贯通 |
| 规格「⚠️ 按需」 |
scroll-into-view-offset、enable-passive → 未声明 |
| 规格「⚠️ 待映射」 |
clip → 未映射(ArkUI 默认裁剪,属性不可控) |
| 规格「⏭️」 |
scroll-y / scroll-top / refresher 全套 / enhanced / WebView 项 → 未声明、未实现(与 AI 一致) |
| 默认值 |
scroll-x=false、show-scrollbar=true(C++ 构造已对齐)、threshold 默认 50 |
| Demo |
正向 + 异常(错类型 / 字符串 "false" 的 Boolean !! 语义) |
属性对照
通用(可交付 / 横向)
| 属性(模板) |
类型 |
规格默认 |
components.md |
当前实现 |
说明 |
scroll-x |
boolean |
false |
✅ 纳入 |
✅ scrollX → horizontal |
optionalTypes:[String] 保留 "false";!! 后仍横滑。NativeBackendElement / adapter 强制 horizontal(仅 false/0/'0' 关闭) |
scroll-left |
number/string |
— |
✅ 纳入 |
✅ → contentOffset.x → ScrollTo |
与 scroll-with-animation 同批在 OnSetPropsEnd 应用 |
upper-threshold |
number/string |
50 |
✅ 纳入(横向) |
✅ → upperThreshold |
OnScroll / OnReachStart → scrolltoupper |
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 等 |
(基础) |
✅ |
tap → click |
实现要点
- TS 仅声明 AI 交付属性;
_syncScrollStyles:开 scroll-x → overflow-x:auto;未开则保留 overflow-y:auto(页级纵向,不声明 scroll-y)。
show-scrollbar:组件层按 Boolean !! 写入 host;adapter → showScrollIndicator。字符串 "false" 经属性系统 !! 后为 true(仍显示滚动条)——异常用例预期。勿在 defaultNativeProps 写死 showScrollIndicator:true(与 removeAttribute 冲突)。
scroll-into-view:原生无 DOM scrollIntoView。NativeBackendElement 按子节点 id 累加主轴尺寸 → contentOffset,并在 setAttribute 后 scrollToPosition(callUIFunction)。
scroll-left + 动画:adapter contentOffset + C++ scrollWithAnimation_;Demo 禁止在 bind:scroll 回写同一 scroll-left 绑定字段(否则出现 200→0)。
- 验证必须重打 jsfwk:
build.sh 已含 build-jsfwk;仅编 demo/HAP 时 adapter / NativeBackend 改动不会进设备。
| 类型 |
覆盖项 |
| 正向 |
scroll-x 默认 / true;受控 scroll-left;scroll-into-view;threshold 边界事件;scroll-with-animation;show-scrollbar=false |
| 异常 |
scroll-x="false" 字符串;upper-threshold="abc" / true;show-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 |