基于antd组件库,手写动态渲染表单项组件

Depend 组件文档

组件概述

Depend 是一个自定义的 React 组件,用于根据表单字段的值动态渲染子组件。它结合了 Ant Design 的 Form 组件的useWatch与useFormInstance,能够根据指定表单字段的值变化来决定是否渲染特定的表单项。

组件 Props

name (必填)

  • 类型 : string | string[]
  • 说明: 指定需要监听的表单字段名。可以是一个字段名或多个字段名的数组。

children

  • 类型 : (values: Record<string, any>) => React.ReactNode
  • 说明: 一个函数,接收当前监听字段的值作为参数,并返回要渲染的 React 组件。

使用场景

Depend 组件适用于需要根据某个或某些表单字段的值动态显示或隐藏某些表单项的场景。例如:

  • 根据某个字段的值是否为特定值(如 age === 18)来显示或隐藏其他表单项。
  • 根据多个字段的组合值动态渲染不同的表单内容。

示例代码

jsx 复制代码
import { Button, Form, Input, type FormInstance } from "antd";
const Demo = () => {
  const Depend = (props: { name: string | string[], children: (value: any, form: FormInstance<any>) => React.ReactNode }) => {
    const { name, children } = props;
    const form = Form.useFormInstance();
    const names = Array.isArray(name) ? name.flat() : [name];
    const values = names.reduce((acc, fieldName) => {
      acc[fieldName] = Form.useWatch(fieldName, form);
      return acc;
    }, {} as Record<string, any>);
    return (
      <>
        {children(values, form)}
      </>
    );
  };
  return (
    <Form onFinish={(value) => {
      console.log(value);
    }}>
      <Form.Item name='age' label='年龄'>
        <Input />
      </Form.Item>
      <Depend name={['age']}>
        {({ age }) => {
          if (age == 18) {
            return <Form.Item name="size" label="尺寸">
              <Input />
            </Form.Item>;
          }
          return null;
        }}
      </Depend>
      <Depend name={['size']}>
        {({ size }) => {
          if (size == 20) {
            return <Form.Item name="height" label="身高">
              <Input />
            </Form.Item>;
          }
          return null;
        }}
      </Depend>
      <Form.Item>
        <Button htmlType="submit">提交</Button>
      </Form.Item>
    </Form>
  );
};
export default Demo;

代码说明

  1. Depend 组件定义
    • 接收 namechildren 作为 props。
    • 使用 Form.useFormInstance() 获取当前表单实例。
    • name 转换为一个数组 names,以处理单个字段或多个字段的情况。
  1. 监听字段值
    • 使用 Form.useWatch 监听指定字段的值,并将所有字段的值存储在一个对象 values 中。
  1. 渲染子组件
    • values 传递给 children 函数,根据字段值动态渲染内容。

注意事项

  1. 类型声明
    • children 函数的参数类型应与表单字段的值类型一致。
    • 如果监听多个字段,values 对象中包含所有字段的值。
  1. 性能优化
    • 过多的 Form.useWatch 调用可能会影响性能,建议仅监听必要的字段。
  1. 嵌套使用
    • Depend 组件可以嵌套使用,以实现更复杂的动态渲染逻辑。
      通过 Depend 组件,可以轻松实现表单字段之间的动态依赖关系,提升表单的交互体验。
相关推荐
over6976 分钟前
用 React Context 实现全局主题切换:从零搭建暗黑/亮色模式系统
前端·react.js·面试
白兰地空瓶12 分钟前
告别“千里传荔枝”:React useContext 打造跨层级通信“任意门”
前端·react.js
用户8168694747251 小时前
Commit 阶段的 3 个子阶段与副作用执行全解析
前端·react.js
白雾茫茫丶1 小时前
动态配色方案:在 Next.js 中实现 Shadcn UI 主题色切换
react.js·next.js
holeer2 小时前
React UI组件封装实战——以经典项目「个人博客」与「仿手机QQ」为例
前端·javascript·react.js·ui·前端框架·软件工程
Blossom.11816 小时前
多模态大模型LoRA微调实战:从零构建企业级图文检索系统
人工智能·python·深度学习·学习·react.js·django·transformer
xhxxx16 小时前
从样式到结构:TailwindCss + Fragment 如何让 React 代码更干净、更高效
前端·css·react.js
ohyeah20 小时前
React 中的跨层级通信:使用 Context 实现主题切换功能
前端·react.js
Dragon Wu21 小时前
前端项目架构 项目格式化规范篇
前端·javascript·react.js·前端框架
RedHeartWWW1 天前
nextjs中,关于Layout组件和Page组件的认知
前端·react.js