picker — 实现与 components.md 对照
对照基准:
- 规格:docs/refs/components.md#picker
- AI 限制:支持(五模式均纳入);无 WebView 分项
- 实现:
packages/flexui-frontend/src/components/picker/picker.ts
packages/flexui-frontend/src/components/picker/region-data.ts(静态省市区)
flexui-engine/driver/js/packages/flexui-backend/src/adapters/picker-adapter.ts
- Native:
FRPickerView.ets
selector → UIContext.showTextPickerDialog
date → UIContext.showDatePickerDialog
time → UIContext.showTimePickerDialog
multiSelector / region → promptAction.openCustomDialog(可 ComponentContent.update 级联)
- Demo:
demos/ascf-ai-demo/.../picker-demo/
模板 kebab-case;组件 properties camelCase;adapter / host attribute 仅 kebab-case。
包名说明:内置组件在 @openflexui/frontend;adapter 在 flexui-backend。
结论摘要
| 维度 |
结论 |
| 规格纳入(✅) |
通用 header-text / mode / disabled / name / bindcancel + 五模式属性与 bindchange(及 multiSelector bindcolumnchange)→ 已声明并实现 |
| 形态 |
JS-logic builtin(NATIVE_JS_LOGIC_BUILTINS);slot + tap 打开弹层 |
| Native |
adapter name: 'Picker';ETS-only(需 UIContext / CustomDialog) |
| region |
内置静态区划;数据源 province-city-china @8.5.8 全国省市区三级(34 省级);直辖市/港澳台合成市列以保持三列;无微信系统服务;level=sub-district → 降级 region;postcode 无数据时为空串 |
| 默认值 |
mode=selector、disabled=false、selector value=0、date fields=day、region level=region |
| form |
带 name 时收集 value(与 input 同路径) |
属性对照
通用
| 属性(模板) |
类型 |
规格默认 |
components.md |
当前实现 |
说明 |
header-text |
string |
— |
✅ |
✅ → payload / 弹层标题 |
OHOS 支持 |
mode |
string |
selector |
✅ |
✅ |
非法回退 selector |
disabled |
boolean |
false |
✅ |
✅ isAttrPresenceOn |
"false" → 仍禁用 |
name |
string |
— |
✅ |
✅ host name |
form 字段 |
bindcancel |
event |
— |
✅ |
✅ cancel |
|
selector / multiSelector
| 属性 |
components.md |
当前实现 |
range / range-key |
✅ |
✅ JS 解析为显示文案数组(列)后交给 native |
value |
✅ number / number[] |
✅ |
bindchange |
✅ { value } |
✅ |
bindcolumnchange |
✅ multi 仅 |
✅ { column, value };可驱动 updatePicker |
time / date
| 属性 |
components.md |
当前实现 |
value / start / end |
✅ |
✅;非法格式回退默认 |
fields |
✅ date |
✅ year/month/day |
region
| 属性 |
components.md |
当前实现 |
value |
✅ string[] |
✅ |
custom-item |
✅ |
✅ 每列顶部插入 |
level |
✅ |
✅;sub-district → region;树见 region-tree.generated.ts(全国 PCA) |
bindchange |
✅ { value, code, postcode } |
✅;postcode 常为空 |
实现要点
- 模板:内层
view + <slot /> + hit-test-ohos=default + catch:tap;host addListener('tap') 双路径 + 50ms 去抖(对齐 label)。
- 打开:
disabled no-op;Native 经 NBE showPicker → callUIFunction('showPicker', [payload]);Domlike 简易 overlay。
- multiSelector 联动:
columnchange → 业务改 range → observer → updatePicker 刷新未关弹层。
- Boolean:
isAttrPresenceOn("false" 仍为 true)。
- 验证:改 adapter / NBE →
build-jsfwk;改 ETS → HAP;仅 frontend → pnpm --filter @openflexui/frontend run build。
Demo 覆盖
| 块 |
覆盖 |
| 正向 |
五模式;selector range-key;multi columnchange;time/date start-end;region custom-item;form name |
| 异常 |
非法 mode;disabled="false";越界 / 错类型 value;非法 time/date |
参考路径
packages/flexui-frontend/src/components/picker/
flexui-engine/.../adapters/picker-adapter.ts
flexui-engine/.../components/picker/FRPickerView.ets
demos/ascf-ai-demo/.../picker-demo/