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 常为空

实现要点

  1. 模板:内层 view + <slot /> + hit-test-ohos=default + catch:tap;host addListener('tap') 双路径 + 50ms 去抖(对齐 label)。
  2. 打开:disabled no-op;Native 经 NBE showPicker → callUIFunction('showPicker', [payload]);Domlike 简易 overlay。
  3. multiSelector 联动:columnchange → 业务改 range → observer → updatePicker 刷新未关弹层。
  4. Boolean:isAttrPresenceOn("false" 仍为 true)。
  5. 验证:改 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/