Formily 异步数据源(dataSource)完整指南:在 effects 与 reactions 中动态管理下拉数据
前端UI组件【免费下载链接】formily Cross Device High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3项目地址https://gitcode.com/gh_mirrors/fo/formily点击查看免费下载导读在 Formily 中下拉选择、级联、树选择等数据型组件的选项数据并不需要你在组件层手写状态管理而是统一收敛到字段模型Field的dataSource属性上。本指南以 async.zh-CN.md 为核心系统讲解异步数据源的两种核心驱动方式effects 与 reactions、内置组件对dataSource的自动消费机制以及业务自定义组件的手动映射方案读完即可在 React 与 JSON Schema 场景下落地接口返回选项、动态切换数据源的完整实践。核心模型Field 的 dataSource 属性异步数据源管理的核心载体是 Field 模型中的dataSource属性。Formily 的设计思想是把选项数据当作字段的一种响应式状态与value、loading、validating等字段状态同等对待任何来源异步请求、联动计算、外部注入只要写入dataSource消费它的组件就会自动感知并重渲染。从 Field 源码 可以看到其数据通路字段初始化时this.dataSource this.props.dataSource即支持通过x-component-props/component[1]或字段属性直接传入初始选项makeObservable中将dataSource标记为observable.ref意味着对它的整体替换会触发订阅者更新这是自动重渲染的底层原理模型上还暴露了命令式方法setDataSource(dataSource?)见 Field.ts#L385-L387可在任意生命周期内以编程方式写入数据源。dataSource的类型定义位于 core/src/types.ts其结构为对象数组且是递归自引用的天然支持树形数据export type FieldDataSource { label?: any value?: any title?: any key?: any text?: any children?: FieldDataSource [key: string]: any }[]这意味着扁平列表只需{ label, value }结构树形结构TreeSelect、Cascader通过children递归嵌套额外键如禁用状态disabled、图标等会被透传字段结构非常灵活。方式一在 effects 中修改 dataSourceeffects 是什么Formily 的 effects 是生命周期事件订阅机制通过createForm的第二个参数传入配合 onFieldEffects.ts 与 onFormEffects.ts 导出的各种事件钩子使用例如onFieldInit/onFieldMount字段初始化 / 挂载后触发onFieldValueChange字段值变化后触发onFieldReact字段反应器执行时触发onFormMount表单挂载后触发常用来做整表数据的首次拉取。典型场景 1字段挂载后拉取远程选项import { createForm, onFieldInit, onFieldValueChange } from formily/core const form createForm({ effects() { // 字段挂载后立即异步拉取该字段的选项 onFieldInit(select, async (field) { field.loading true // 进入加载态Select 组件会展示 loading 图标 const res await fetchOptions() field.dataSource res.data // 写入 dataSource组件自动重渲染 field.loading false }) // 也可以响应其他字段变化联动刷新数据源 onFieldValueChange(province, (field) { const cityField form.query(city).take() if (!cityField) return cityField.loading true fetchCities(field.value).then((res) { cityField.dataSource res.data cityField.loading false }) }) }, })典型场景 2在表单挂载时统一初始化如果多个字段共享同一份选项数据可以挂在onFormMount中统一处理import { createForm, onFormMount } from formily/core const form createForm({ effects() { onFormMount(async () { const res await fetchAllDictionaries() form.query(role).take((field) (field.dataSource res.roles)) form.query(department).take((field) (field.dataSource res.departments)) }) }, })方式二在 reactions 中修改 dataSourcereactions是字段模型上的响应式字段联动描述类型见 IFieldProps.reactions为(field: Field) void或函数数组。它与 effects 的区别在于reactions 是声明在字段自身上的跟随字段模型随 JSON Schema 一起被序列化描述更适用于 Schema 化场景如 JSON Schema 表单、设计器产物。import { createForm } from formily/core const form createForm({ fields: { province: { type: string, enum: provinceOptions, // 初始 dataSource }, city: { type: string, reactions(field) { // 当 province 变化时根据其值异步刷新 city 的数据源 const province field.query(province).get(value) if (!province) { field.dataSource [] return } field.loading true fetchCities(province).then((res) { field.dataSource res.data field.loading false }) }, }, }, })在 React 中reactions可以写在createSchemaField的组件 props 上或 JSON Schema 的x-reactions中在核心层字段初始化时会将props.reactions注册为字段的响应式依赖任何被读取的字段状态变化都会重新执行该函数对应onFieldReact生命周期。选择建议逻辑偏事件式如提交后刷新、定时轮询用effects逻辑偏声明式联动依赖其他字段值、可随 Schema 分发用reactions。两者都能修改dataSource也可以混用。内置组件的自动消费dataSource 到 props 的映射文档中强调如果字段组件内部有消费dataSource属性当dataSource变化时组件会自动重渲染。这一能力由formily/react的connectmapProps实现各内置组件的映射关系如下以 antd 包为例组件源码位置dataSource 映射到Selectpackages/antd/src/select/index.tsxoptions并同步映射loadingTreeSelectpackages/antd/src/tree-select/index.tsxtreeDataCascaderpackages/antd/src/cascader/index.tsxoptionsRadiopackages/antd/src/radio/index.tsxoptionsCheckboxpackages/antd/src/checkbox/index.tsxoptions以 Select 为例select/index.tsx 中export const Select: ReactFCSelectPropsany, any connect( AntdSelect, mapProps( { dataSource: options, loading: true, }, ... ), mapReadPretty(PreviewText.Select) )mapProps({ dataSource: options, loading: true })的含义是字段的dataSource会映射为 antd Select 的options字段的loading/validating会映射为 loading 状态并渲染旋转图标。因此只要在 effects / reactions 中写入field.dataSource与field.loadingSelect 就会自动刷新选项并展示加载动画无需任何组件层手动 setState。// 一个完整的最小示例挂载后拉取选项 const form createForm({ effects() { onFieldInit(select, (field) { field.loading true setTimeout(() { field.dataSource [ { label: 选项一, value: 1 }, { label: 选项二, value: 2 }, ] field.loading false }, 500) }) }, })业务自定义组件手动映射 dataSource如果使用业务自定义组件没有经过上述connect包装dataSource不会自动成为组件的 props必须手动映射。文档给出了两条路径路径 A使用 connect mapProps用connect包装自定义组件声明dataSource到组件 props 的映射关系import { connect, mapProps } from formily/react const MySelect connect( BaseSelect, // 你的业务组件内部读取 props.options mapProps({ dataSource: options, // 字段 dataSource - 组件 options loading: true, }) )之后在 Schema 中直接使用MySelect作为x-component即可享受与内置 Select 一致的自动数据绑定。路径 Bobserver useField 手动读取如果组件结构复杂、不适合用connect映射可以用observer包裹组件并在组件内部通过useField拿到字段模型主动读取field.dataSource并渲染import { observer, useField } from formily/react const MySelect observer(() { const field useFieldany() // 取到字段模型 return ( BaseSelect options{field.dataSource} // 手动映射 loading{field.loading} / ) })observer会让组件订阅字段模型的响应式状态当field.dataSource被替换时observable.ref变更组件自动重渲染——这与内置组件的行为完全一致只是把映射这一步从框架代劳改成了自己声明。响应式原理小结整条链路可以归纳为写入effects / reactions 中给field.dataSource赋值或调用field.setDataSource(...)通知dataSource作为observable.ref见 Field.ts#L140整体替换会触发依赖它的订阅者消费connect包装的组件通过mapProps把dataSource注入组件 propsobserver组件则通过useField直接订阅渲染组件收到新选项后自动重渲染配合field.loading展示加载状态。这套机制让异步数据源在 Formily 中不需要任何额外的状态管理库字段模型本身就是选项数据的唯一真源Single Source of Truth这也是其 JSON Schema 场景json-schema 包与 React/Vue 各渲染层packages/react、packages/vue、packages/antd、packages/next保持一致行为的基础。进阶实践建议统一字典服务将高频字典选项抽成可复用的 effects 函数或自定义 Hook在onFieldInit中按field.path匹配字典 key 拉取避免每个字段重复写请求逻辑联动清空当上游字段变化导致下游数据源失效时记得同时清空下游field.value如cityField.setValue(undefined)避免出现选项已变、旧值仍残留错误兜底异步请求失败时在 effects / reactions 的 catch 中设置field.feedback如field.setSelfErrors([数据加载失败])并关闭loading保证表单不会卡在加载态分页/搜索型下拉对于远程搜索场景可以结合onFieldValueChange或组件自身的搜索事件把关键字写入外部状态并驱动dataSource更新结构与上述示例一致。更多相关内置组件的具体行为可参考 antd 组件文档 中 Select、TreeSelect、Cascader 各章节以及核心层 Field 模型文档。赞分享前端UI组件【免费下载链接】formily Cross Device High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3项目地址https://gitcode.com/gh_mirrors/fo/formily点击查看免费下载相关推荐Formily Select 下拉框组件实战同步/异步数据源与联动场景全解formily/antdFormily Select 下拉框组件实战同步/异步数据源与联动场景全解formily/antd Formily 是一套跨端、高性能的表单解决方案支前端UI组件管理业务逻辑Formily 中 effects 与 reactions 的选型与实践指南管理业务逻辑Formily 中 effects 与 reactions 的选型与实践指南 Formily 2.x 在 docs/guide/advanced/前端UI组件formily × Element UIVue 2Select 下拉选择组件实战全指南同步/异步数据源与联动方案formily × Element UIVue 2Select 下拉选择组件实战全指南同步/异步数据源与联动方案 本指南以 formily/elemen前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

芯片时钟树结构选型指南:H-Tree、Mesh等五种方案对比

芯片时钟树结构选型指南:H-Tree、Mesh等五种方案对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 8:04:31 阅读更多 →
苹果手机按键手写实现避坑:3个致命Bug修复方案

苹果手机按键手写实现避坑:3个致命Bug修复方案

苹果手机按键手写实现避坑:3个致命Bug修复方案 官方文档翻了三遍还是没搞懂 iPhone 按键响应机制?别急,问题不在你不够努力,而是 Apple 的 HIG…

2026/9/23 8:04:31 阅读更多 →
FOFATOTO:突破FOFA批量查询与深度导出的实战指南

FOFATOTO:突破FOFA批量查询与深度导出的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 8:04:31 阅读更多 →

最新新闻

学术报奖  基金申报|项目申请书配图全攻略

学术报奖 基金申报|项目申请书配图全攻略

每年国自然、重点研发、省市级基金、教学成果奖、科技报奖申报季,很多科研人把大量时间花在文字打磨,却忽略配图。评审阅读申请书的速度极快,文字看摘要,逻辑看配图。一张逻辑清晰、风格规范的示意图,能快速把科学问题…

2026/9/23 8:47:02 阅读更多 →
Plugin4Shell 漏洞复盘|Claude Code/Codex/Copilot/Gemini CLI 受影响版本、修复版本与团队防护清单

Plugin4Shell 漏洞复盘|Claude Code/Codex/Copilot/Gemini CLI 受影响版本、修复版本与团队防护清单

开头一句导语:9/17 披露的 Plugin4Shell 是 AI 编码 agent 插件生态首个被完整披露的供应链级零点击 RCE。本文只讲三件事:影响范围与版本、攻击链原理、你现在就能执行的排查与加固命令/配置。1. 影响范围与版本对照表(表格)工具…

2026/9/23 8:47:02 阅读更多 →
sublime text 3 lincense被删除解决办法

sublime text 3 lincense被删除解决办法

将下面下面的内容加入到你的hosts文件127.0.0.1 license.sublimehq.com 127.0.0.1 45.55.255.55 127.0.0.1 45.55.41.223

2026/9/23 8:47:02 阅读更多 →
Karpathy 力推的 LLM Wiki 到底强在哪?一文读懂企业知识库的“编译执行”革命

Karpathy 力推的 LLM Wiki 到底强在哪?一文读懂企业知识库的“编译执行”革命

不要等提问时才把知识临时拼起来,而是提前把资料编译成 Wiki——从向量检索走向知识大脑,中间隔着的正是这一步。 最近在给一个几千页的内部知识库做检索优化时,我又一次撞上了那个老问题:切 Chunk、算 Embedding、存向量库&…

2026/9/23 8:47:02 阅读更多 →
矿用振动筛、矿山振动筛、冶金振动筛怎么选?按行业物料工况定制适配详解

矿用振动筛、矿山振动筛、冶金振动筛怎么选?按行业物料工况定制适配详解

摘要矿用振动筛、矿山振动筛、冶金振动筛是矿山选矿、砂石骨料、煤炭加工、冶金冶炼等领域的核心分级与脱水设备,其选型质量直接影响生产线的处理能力、筛分精度和运维成本。不同行业对振动筛的要求差异显著:矿山行业侧重大处理量和耐磨性,冶…

2026/9/23 8:47:02 阅读更多 →
设计模式8——工厂方法(Factory Method)

设计模式8——工厂方法(Factory Method)

一、动机 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。 Product* p new ProductA();代码直接写死 new ProductA ,如果以后新增产品 ProductB ,要到处改业务代码&…

2026/9/23 8:46:01 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →