• React-hook-form-mui(五):包含内嵌表单元素的表单


    前言

    在上一篇文章中,我们介绍了react-hook-form-mui如何与与后端数据联调。在实际项目中,从后端获取的数据可能是复杂的数据对象,本文将介绍,如何通过react-hook-form-mui实现一个包含内嵌表单元素的表单

    Demo

    以下代码实现了一个包含内嵌表单元素的表单的完整代码:

    import React from 'react';
    import { useForm } from 'react-hook-form';
    import { Button, MenuItem } from '@mui/material';
    import { FormContainer, TextFieldElement } from 'react-hook-form-mui';
    
    //内嵌表单元素
    const InnerForm = ({ index }: any) => {
      return (
        <>
          <TextFieldElement name={`items[${index}].name`} label="Name" />
          <TextFieldElement
            name={`items[${index}].quantity`}
            label="Quantity"
            type="number"
          />
        </>
      );
    };
    
    const MyForm = () => {
      const formContext = useForm({
        defaultValues: {
          firstName: '',
          lastName: '',
          email: '',
          gender: '',
          age: '',
          items: [{ name: '', quantity: '' }]
        }
      });
      const { watch } = formContext;
    
      const onSubmit = (data) => {
        console.log(data);
      };
    
      return (
        <FormContainer
          formContext={formContext}
          onSuccess={(data) => {
            onSubmit(data);
          }}
        >
          <TextFieldElement name="firstName" label="First Name" />
          <TextFieldElement name="lastName" label="Last Name" />
          <TextFieldElement name="email" label="Email" />
          <TextFieldElement select name="gender" label="Gender">
            <MenuItem value="male">Male</MenuItem>
            <MenuItem value="female">Female</MenuItem>
          </TextFieldElement>
          <TextFieldElement name="age" label="Age" type="number" />
          {watch('items')?.map((_, index) =>
            <InnerForm key={index} index={index} />
          )}
          //像数组中插入表新的元素
          <Button
            type="button"
            onClick={() => watch('items').push({ name: '', quantity: '' })}
          >
            Add Item
          </Button>
          <Button type="submit">Submit</Button>
        </FormContainer>
      );
    };
    
    export default MyForm;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    解析

    //内嵌表单元素
    const InnerForm = ({ index }: any) => {
      return (
        <>
          <TextFieldElement name={`items[${index}].name`} label="Name" />
          <TextFieldElement
            name={`items[${index}].quantity`}
            label="Quantity"
            type="number"
          />
        </>
      );
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    以上代码是实现内嵌表单元素的关键代码,了解以上代码,我们需要了解react-hook-form-mui的核心理念。它是通过获取表单元素的name,生成数据结构数。因此,对于内嵌的组件而言,我们需要通过index来给name赋值。这样就可以获取到内嵌表单元素的表单值。

    总结

    以上是关于React-hook-form-mui的内嵌表单元素的讲解。希望本文会对你有所帮助。如果有什么问题,可在下方留言沟通。

  • 相关阅读:
    Jenkins结合gitlab自动化持续集成
    人在囧途,你该怎么办?
    JL-A/41 JL-A/42 JL-A/43 集成电路电流继电器 过负荷或短路 JOSEF约瑟
    第四十五章 开发自定义标签 - 规则和操作
    Java JVM虚拟机
    解锁云计算的未来:AI、容器和数据隐私的挑战
    C++ 多态
    谷粒商城笔记+踩坑(4)——商品服务-品牌管理
    sqlflow简介,在线版:使用sqlflow,本地版:在windows上安装sqlflow
    FileReader文件字符输入流
  • 原文地址:https://blog.csdn.net/m0_73117087/article/details/132443957