如何在 React 中的可重用组件上操作对象 属性
How to manipulate object property on a reusable component in React
我在调查问卷的很多输入部分使用 MUIs 输入字段,并想将其保存到我的状态变量中,该变量是一个包含我所有表单值的对象。如何在可重复使用的 MUI 组件中操作我的 formData 对象?
我目前将 formData 作为 prop 传递给组件,但我不确定如何在组件内部使用 setFormData,因为每次我使用它时它都会不同 属性。
我认为每个问题都是状态对象 formData 的 属性,所以它看起来像
formData{question1: 'foo', question2: 'bar'}
这是表格目前的样子(我不介意更改结构,如果这样做有意义的话
看一下表单上的InputField(我也附上了组件代码)
<QuestionLabel>Do you have a "Nickname":</QuestionLabel>
<InputField value={props.formData.nickname}/>
<QuestionLabel>Preferred Language:</QuestionLabel>
<InputField value={props.formData.language}/>
<QuestionLabel>Occupation:</QuestionLabel>
<InputField value={props.formData.occupation}/>
这是组件的外观(我知道我必须更改它)
export default function InputField(props){
return(
<TextField
fullWidth
value={props.value}
variant='standard'
/>
)
}
免责声明
首先post很抱歉,如果格式不完美或者我以不方便的方式附加了代码片段,如果是这样的话请给我一些指示
由于在 React 中没有双向绑定,使用受控组件处理表单输入的正常方法是每次更改时从特定的 dom 元素中提取文本。我们使用 event.target.value
提取数据来执行此操作,但是我们如何在可重用组件中将其正确添加到您的状态?
为此,我们希望将名称标签添加到输入字段,然后在将值添加到我们的状态时使用它。如您正确所述,formData.someName = 'some text'
我们在 changeHandler
函数中更新我们的状态,该函数在每次输入更改时更新我们的状态。
例如,假设我们将 setFormData、formData 和 fieldName 传递给道具:
export default function InputField(props){
const {setFormData, formData, fieldName} = props //destructure the props
const changeHandler = (event) => {
// updates the formData state of formData.name to equal event.target.value
setFormData({...formData, [event.target.name]: event.target.value})
}
return(
<TextField
fullWidth
name={fieldName}
value={formdata.fieldName}
onChange={changeHandler}
variant='standard'
/>
)
}
使用上面的组件看起来像这样:
<InputField setFormData={setFormData} formData={formData} fieldName="question1">
通过将 属性 传递到需要更改的组件中,我能够让它工作;这是我在文本字段组件上的 handleChange 函数:
const handleChange = (event) => {
var formData = {...props.formData}
formData[props.property] = event.target.formData
props.onChange(formData)
}
我在调查问卷的很多输入部分使用 MUIs 输入字段,并想将其保存到我的状态变量中,该变量是一个包含我所有表单值的对象。如何在可重复使用的 MUI 组件中操作我的 formData 对象?
我目前将 formData 作为 prop 传递给组件,但我不确定如何在组件内部使用 setFormData,因为每次我使用它时它都会不同 属性。
我认为每个问题都是状态对象 formData 的 属性,所以它看起来像
formData{question1: 'foo', question2: 'bar'}
这是表格目前的样子(我不介意更改结构,如果这样做有意义的话
看一下表单上的InputField(我也附上了组件代码)
<QuestionLabel>Do you have a "Nickname":</QuestionLabel>
<InputField value={props.formData.nickname}/>
<QuestionLabel>Preferred Language:</QuestionLabel>
<InputField value={props.formData.language}/>
<QuestionLabel>Occupation:</QuestionLabel>
<InputField value={props.formData.occupation}/>
这是组件的外观(我知道我必须更改它)
export default function InputField(props){
return(
<TextField
fullWidth
value={props.value}
variant='standard'
/>
)
}
免责声明 首先post很抱歉,如果格式不完美或者我以不方便的方式附加了代码片段,如果是这样的话请给我一些指示
由于在 React 中没有双向绑定,使用受控组件处理表单输入的正常方法是每次更改时从特定的 dom 元素中提取文本。我们使用 event.target.value
提取数据来执行此操作,但是我们如何在可重用组件中将其正确添加到您的状态?
为此,我们希望将名称标签添加到输入字段,然后在将值添加到我们的状态时使用它。如您正确所述,formData.someName = 'some text'
我们在 changeHandler
函数中更新我们的状态,该函数在每次输入更改时更新我们的状态。
例如,假设我们将 setFormData、formData 和 fieldName 传递给道具:
export default function InputField(props){
const {setFormData, formData, fieldName} = props //destructure the props
const changeHandler = (event) => {
// updates the formData state of formData.name to equal event.target.value
setFormData({...formData, [event.target.name]: event.target.value})
}
return(
<TextField
fullWidth
name={fieldName}
value={formdata.fieldName}
onChange={changeHandler}
variant='standard'
/>
)
}
使用上面的组件看起来像这样:
<InputField setFormData={setFormData} formData={formData} fieldName="question1">
通过将 属性 传递到需要更改的组件中,我能够让它工作;这是我在文本字段组件上的 handleChange 函数:
const handleChange = (event) => {
var formData = {...props.formData}
formData[props.property] = event.target.formData
props.onChange(formData)
}