ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Refine SaveButton 组件详解:在 Ant Design 表单中一键封装提交、加载与禁用逻辑

Refine SaveButton 组件详解:在 Ant Design 表单中一键封装提交、加载与禁用逻辑 Refine SaveButton 组件详解在 Ant Design 表单中一键封装提交、加载与禁用逻辑【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine本篇文章围绕 Refinerefine在 v3 版本中面向 Ant Design 的SaveButton组件展开讲解它如何以最薄的方式复用 Ant Design 的Button并与useForm返回的saveButtonProps协作从而把表单提交、按钮 loading、禁用状态等重复逻辑收敛到一处。读完本文你将掌握saveButtonProps的完整接入姿势、hideText等关键属性的使用场景以及该组件在 Refine 源码中的真实实现与测试验证。背景为什么需要 SaveButton在 Refine Ant Design 的 CRUD 页面里保存按钮几乎是每个 Edit / Create 页面必备的操作入口。如果每个页面都手写一遍点击后调用form.submit()、提交期间禁用、根据状态切换 loading代码会迅速重复膨胀。SaveButton的意义在于它在展示层直接复用了 Ant Design 的Button组件只负责呈现不做业务逻辑在逻辑层它通过 Refine 提供的saveButtonProps与useForm等表单 Hooks 打通自动获得提交表单、按钮 loading、禁用状态三项能力见 save.md 原文它还支持通过refine CLI 进行 swizzle把组件源码释放到项目里按需定制相关 CLI 用法见 cli 文档。基础用法用saveButtonProps让表单按钮活起来原文档给出的核心场景是把useForm返回的saveButtonProps传给Edit由Edit内部的保存按钮消费。完整示例import { Edit, Form, Input, useForm } from pankod/refine-antd; const PostEdit: React.FC () { const { formProps, saveButtonProps } useFormIPost(); return ( Edit saveButtonProps{saveButtonProps} Form {...formProps} layoutvertical Form.Item labelTitle nametitle rules{[ { required: true, }, ]} Input / /Form.Item /Form /Edit ); }; interface IPost { id: number; title: string; }这个示例展示了三层协作useFormIPost()负责管理表单状态并向外暴露formProps与saveButtonPropsForm {...formProps}把 onFinish、onValuesChange、initialValues 等全部表单行为接好Edit saveButtonProps{saveButtonProps}将保存按钮与表单提交行为绑定——saveButtonProps中封装了提交动作、loading 与禁用状态。saveButtonProps在源码里到底做了什么在 packages/antd/src/hooks/form/useForm.ts 中可以清晰看到saveButtonProps的实现const saveButtonProps { disabled: formLoading, onClick: () { form.submit(); }, };也就是说onClick触发form.submit()走的是 Ant Design Form 的受控提交流程disabled与formLoading绑定提交期间按钮自动禁用避免重复提交。随后在返回值中随useForm一并暴露useForm.ts。这就是提交表单、按钮 loading、禁用状态三个能力的实现来源。属性详解hideText用于控制按钮文本是否显示置为true时只保留图标文本隐藏。典型场景是工具栏空间紧张、希望按钮更紧凑时使用import { SaveButton } from pankod/refine-antd; const MySaveComponent () { return ( SaveButton hideText / ); };其他可用属性SaveButton的属性类型为SaveButtonProps在 packages/antd/src/components/buttons/types.ts 中被定义为export type SaveButtonProps RefineSaveButtonPropsButtonProps;它组合了两部分能力Refine 通用按钮属性定义于 packages/ui-types/src/types/button.tsxhideText?: boolean是否只显示图标RefineButtonCommonPropsonClick?: React.PointerEventHandlerHTMLButtonElement点击事件处理RefineButtonLinkingProps。Ant Design Button 的全部原生属性因为TComponentProps透传了ButtonProps所以type、size、disabled、loading、htmlType等均可直接使用。原文档特别提示SaveButton同时接受 Ant Design Button 的所有 props。这意味着你可以放心地叠加自定义样式与原生按钮行为。源码实现一个纯粹的展示组件SaveButton的实现非常克制完整源码位于 packages/antd/src/components/buttons/save/index.tsxexport const SaveButton: React.FCSaveButtonProps ({ hideText false, children, ...rest }) { const { label } useSaveButton(); return ( Button typeprimary icon{SaveOutlined /} >export const useSaveButton () useActionableButton({ type: save });也就是说按钮文案由 Refine 的 i18n 体系统一管理随语言切换自动变化这比硬编码 Save 更利于多语言应用。可测试性与样式挂载点通过data-testid{RefineButtonTestIds.SaveButton}与className{RefineButtonClassNames.SaveButton}提供稳定的测试选择器与样式类方便 E2E 与单元测试定位。测试验证Refine 为SaveButton编写了统一的组件测试。在 packages/antd/src/components/buttons/save/index.spec.tsx 中import { buttonSaveTests } from refinedev/ui-tests; import { SaveButton } from ./; describe(Save Button, () { buttonSaveTests.bind(this)(SaveButton); });这里复用了refinedev/ui-tests中针对 save 按钮的共享测试套件见 packages/ui-tests保证了 antd、chakra-ui、mantine、mui 各实现的按钮行为一致。此外saveButtonProps的集成行为也在 useForm.spec.tsx 等测试中被覆盖。进阶Edit / Create 组件的联动saveButtonProps不仅能直接传给Edit同样适用于Create组件。在 packages/antd/src/components/crud/edit/index.tsx 与 packages/antd/src/components/crud/create/index.tsx 中saveButtonProps都会被转发给内部的SaveButton。因此在 Edit 页面Edit saveButtonProps{saveButtonProps}即获得更新语义的保存按钮在 Create 页面Create saveButtonProps{saveButtonProps}即获得新建语义的保存按钮同一份saveButtonProps、同一个组件两种业务语义都由 Refine 内部根据资源动作自动区分页面代码无需复制粘贴。何时使用 Swizzle 定制如果你需要改变保存按钮的默认行为例如默认图标、默认文案或默认 classNameRefine 提供了 swizzle 机制通过 refine CLI 可以将SaveButton源码复制进项目pankod/refine-antd对应版本随后直接修改本地副本。具体命令与交互流程参见 refine CLI 文档。注意本文示例基于 v3 文档pankod/refine-antd命名空间。若使用 Refine v4 及更高版本包名已迁移为refinedev/antd但saveButtonProps的使用模式保持一致。小结SaveButton是 Refine 组件体系中展示与逻辑分离的典型代表组件本体只负责把 Ant Design 的Button包装成带默认主色、保存图标、国际化文案的按钮真正的业务能力提交、loading、禁用全部由useForm返回的saveButtonProps注入。理解这一模式后你可以在任何表单页面用两行代码接入一个行为完备的保存按钮并在需要时通过 swizzle 或透传原生ButtonProps完成定制。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表