尧图精选

Ant Design Transfer 组件状态(status)详解:error/warning 校验状态的实现与实战

🕒 发布时间:2026/9/20 12:40:43 📁 来源:尧图网络
Ant Design Transfer 组件状态status详解error/warning 校验状态的实现与实战【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design导读本文围绕 antd 官方示例 components/transfer/demo/status.md 展开深入讲解 Transfer 穿梭框组件通过status属性展示error/warning两种校验状态的使用方法。你将掌握status的取值规则、与 Form 表单校验上下文的联动机制、底层样式实现原理以及如何在实际表单场景中落地这套状态反馈方案。一、官方示例一分钟上手status官方 Demostatus.md的完整代码如下对应 status.tsximport React from react; import { Flex, Transfer } from antd; const App: React.FC () ( Flex gapmiddle vertical Transfer statuserror / Transfer statuswarning showSearch / /Flex ); export default App;要点解读statuserror将 Transfer 的整体边框渲染为错误色colorError用于提示用户当前选择不满足校验要求statuswarning将边框渲染为警告色colorWarning用于低优先级的提醒第二个示例额外开启了showSearch说明status与搜索功能可以同时使用互不干扰外层用Flex纵向排列两个 Transfer便于直观对比两种状态。从类型定义看components/transfer/index.tsxstatus的取值由InputStatus约束status?: InputStatus;而InputStatus定义于 components/_util/statusUtils.tsconst InputStatuses [warning, error, ] as const; export type InputStatus (typeof InputStatuses)[number];即status只接受warning、error或空字符串三种取值空串等价于不传即默认状态。二、API 定义与参数说明在 index.zh-CN.md 的 API 表格中status参数定义如下参数说明类型默认值版本status设置校验状态error \| warning-4.19.0参数细节类型error | warning不传时组件保持默认边框样式默认值-无默认值由 Form 校验上下文或显式传入决定引入版本该能力自antd 4.19.0起提供使用低版本需先升级。注意官方文档表格中只列了error | warning两个合法取值但源码层面InputStatus额外允许见 statusUtils.ts传空串与不传效果一致。三、源码级实现status是如何生效的3.1 状态合并逻辑Transfer 组件在渲染前会做一次「上下文状态 自定义状态」的合并components/transfer/index.tsxconst formItemContext useContextFormItemStatusContextProps(FormItemInputContext); const { hasFeedback, status } formItemContext; // ... const mergedStatus getMergedStatus(status, customStatus);合并函数定义于 statusUtils.tsexport const getMergedStatus (contextStatus?: ValidateStatus, customStatus?: InputStatus) customStatus || contextStatus;从中可以推断出明确的优先级规则显式传入的status属性 Form.Item 校验上下文中的状态。也就是说当status显式传入时直接采用显式值未传status时若组件位于Form.Item内会继承表单校验产生的状态success/warning/error/validating。3.2 状态类名生成合并后的状态通过getStatusClassNames映射为 CSS 类名components/transfer/index.tsxconst cls classNames( prefixCls, { [${prefixCls}-disabled]: disabled, [${prefixCls}-customize-list]: !!children, [${prefixCls}-rtl]: dir rtl, }, getStatusClassNames(prefixCls, mergedStatus, hasFeedback), // ... );getStatusClassNames的实现statusUtils.ts会按状态生成如下类名status success→{prefixCls}-status-successstatus warning→{prefixCls}-status-warningstatus error→{prefixCls}-status-errorstatus validating→{prefixCls}-status-validatinghasFeedback为真 →{prefixCls}-has-feedback因此对 Transfer 来说statuserror最终会渲染出ant-transfer-status-error这个类名。这一点可以从快照测试中得到印证在 components/transfer/tests/snapshots/demo.test.ts.snap 中渲染status.tsx示例后根元素类名即为ant-transfer ant-transfer-status-errorwarning 状态同理为ant-transfer-status-warning。3.3 样式实现边框颜色切换状态样式的核心在 components/transfer/style/index.tsconst genTransferStatusColor (token: TransferToken, color: string): CSSObject { const { componentCls, colorBorder } token; return { [${componentCls}-list]: { borderColor: color, -search:not([disabled]): { borderColor: colorBorder, }, }, }; }; const genTransferStatusStyle: GenerateStyleTransferToken (token: TransferToken): CSSObject { const { componentCls } token; return { [${componentCls}-status-error]: { ...genTransferStatusColor(token, token.colorError), }, [${componentCls}-status-warning]: { ...genTransferStatusColor(token, token.colorWarning), }, }; };实现细节说明error状态将左右两个列表区域ant-transfer-list的边框设为主题色colorErrorwarning状态将边框设为colorWarning搜索框-search在非禁用状态下保持原有colorBorder边框色避免搜索框与列表边框视觉冲突状态样式基于 cssinjs token 体系生成颜色会随主题变量自动适配明暗模式与定制主题。四、实战场景在 Form 中联动校验状态status最常见的落地场景是配合 Form 表单的校验规则。由于 Transfer 支持从FormItemInputContext继承状态见 components/transfer/index.tsx只需将 Transfer 放入Form.Item并设置校验规则即可自动展示错误状态import React from react; import { Form, Transfer } from antd; const App: React.FC () { const dataSource [ { key: 1, title: 前端组 }, { key: 2, title: 后端组 }, { key: 3, title: 设计组 }, ]; return ( Form nameteam-transfer layoutvertical Form.Item label成员分组 namegroups rules{[{ required: true, message: 请至少选择一个分组 }]} Transfer dataSource{dataSource} showSearch render{(item) item.title!} titles{[可选分组, 已选分组]} / /Form.Item /Form ); }; export default App;行为说明未选择任何分组时点击提交Form 校验失败Form.Item将错误状态写入上下文Transfer 自动获得ant-transfer-status-error类名与红色边框用户无需手动管理status属性状态完全由表单驱动若希望覆盖表单状态可显式传入statuswarning等值此时显式值优先生效参考getMergedStatus的customStatus || contextStatus逻辑。五、测试验证仓库为status能力提供了自动化测试保障快照测试renders components/transfer/demo/status.tsx correctly断言了ant-transfer-status-error、ant-transfer-status-warning类名的渲染结果见 demo.test.ts.snap并有对应的扩展上下文测试demo-extend.test.ts.snap组件级类型约束status?: InputStatus保证非法取值在编译期即被拦截index.tsx。六、小结维度结论合法取值error、warning源码另允许见 statusUtils.ts生效范围左右列表区域边框颜色style/index.ts优先级显式status Form.Item 校验上下文index.tsx引入版本antd 4.19.0index.zh-CN.md相关类名ant-transfer-status-error/ant-transfer-status-warning掌握status属性的取值与优先级规则后你可以在独立使用场景下通过显式status传达选择校验结果也可以在 Form 场景下让 Transfer 自动跟随表单校验状态构建完整一致的表单反馈体验。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →