【问题标题】:React form with nested json and controlled components使用嵌套 json 和受控组件反应表单
【发布时间】:2021-05-26 12:26:46
【问题描述】:

我正在构建一个带有可重用组件的反应表单。

我想更新我的 json 以便我可以嵌套一些数据,但是我遇到了一个“受控与不受控”的错误(再次!),我无法解决。我一直在研究它,但我可能缺乏正确的词汇来提高效率。我应该在哪里或如何定义“宠物”..?

后来,我的目标是能够为一个主人添加几只宠物。

宠物表格

import React, { useState, useEffect } from 'react';
import Controls from './reusables/Controls';
import { useForm, Form } from './reusables/useForm';

const initialFieldValues = {
    id: 0,
    owner: '',
    pet : [{
        petName: '',
        petBreed: ''
    }]
}
export default function PetsForm(props) {
    const {
        values,
        setValues,
        errors,
        setErrors,
        handleInputChange,
        resetForm
    } = useForm(initialFieldValues, true, validate);
 return (
    <Paper>
       <Box>
             <Controls.Input
                   label="Owner"
                   name='owner'
                   placeholder="Owner"
                   value={values.owner = values.owner.toUpperCase()}
                   onChange={handleInputChange}
              />
              <Controls.Input
                   label="PetName"
                   name='petName'
                   placeholder="Pet Name"
                   value={values.petName = values.petName.toUpperCase()}
                   onChange={handleInputChange}
              />
              <Controls.Input
                   label="PetBreed"
                   name='petBreed'
                   placeholder="Pet Breed"
                   value={values.petBreed}
                   onChange={handleInputChange}
              />
        </Box>
   </Paper>
etc...
}

我的使用表单

export function useForm(initialFieldValues, validateOnChange=false, validate) {

    const [values, setValues] = useState(initialFieldValues);
    const [errors, setErrors] = useState({});

    const handleInputChange = event => {
        const { name, value } = event.target 
        setValues({
            ...values,
            [name]: value,
        })
        if(validateOnChange)
        validate({ 
            [name]: value,
        })
    }

    return {
        values,
        setValues,
        errors,
        setErrors,
        handleInputChange,
    };
}

【问题讨论】:

    标签: json reactjs forms


    【解决方案1】:

    您收到错误是因为您的值 values.petNamevalues.petBreedundefined。因为你的价值观是

    const initialFieldValues = {
        id: 0,
        owner: '',
        pet : [{
            petName: '',
            petBreed: ''
        }]
    }
    

    所以petnamepetBreed 必须称为values.pet.[0].petNamevalues.pet.[0].petBreed

    设置嵌套对象的值

    您可以使用 lodash set 设置深度嵌套对象的值。您需要做的就是提供name 作为虚线路径值。对于 petname,您需要提供 name 属性为 pet.[0].petName

    现在我们可以使用 lodash set 设置值对象的值,

     const handleInputChange = event => {
            const { name, value } = event.target 
            // clone the values . you can use lodash cloneDeep for this
            set(clonedValues, name, value);
            setValues(clonedValues); 
            ....
        }
    

    现在您可以检索深度嵌套的值

    <Controls.Input
        label="PetBreed"
        name='pet.[0].petBreed'
        placeholder="Pet Breed"
        value={values.pet.[0].petBreed}
        onChange={handleInputChange}
     />
    

    【讨论】:

    • 嗨@Shyam,感谢您的友好回答。我一直在尝试使用 lodash,但我无法让数据持久化。一旦我进入另一个字段,前一个字段就会消失。知道我错过了什么吗?
    • 你能用你试过的代码更新问题吗?
    • 哦,我的错,它工作得很好,在编辑时我意识到我的 value/S 有错别字。非常感谢您的 lodash 建议并向我介绍浅拷贝和深拷贝:)
    猜你喜欢
    • 2021-03-21
    • 2019-07-13
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2019-02-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多