Javascript 使用多个关键点更改对象的单个值而不重复
我试图找到一种更简洁的方法来处理这种模式,在处理表单字段的更改时,我经常遇到react 对于我的表单对象中的每个元素,我处理一个值的变化,我发现我自己用useState()的setter函数复制了这个模式。我已经尝试过一些事情,比如创建formState的浅拷贝,并对其进行变异,但我能真正让事情正常运行的唯一方法是使用bellow模式,这感觉有点重复Javascript 使用多个关键点更改对象的单个值而不重复,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我试图找到一种更简洁的方法来处理这种模式,在处理表单字段的更改时,我经常遇到react 对于我的表单对象中的每个元素,我处理一个值的变化,我发现我自己用useState()的setter函数复制了这个模式。我已经尝试过一些事情,比如创建formState的浅拷贝,并对其进行变异,但我能真正让事情正常运行的唯一方法是使用bellow模式,这感觉有点重复 const handleTitle = evt => { props.setFormState({ title: ev
const handleTitle = evt => {
props.setFormState({
title: evt.target.value,
bio: props.formState.bio,
formExpertise: props.formState.formExpertise,
formExpertiseYears: props.formState.formExpertiseYears
});
};
如果要包含
this.props.formState
,可以将对象扩展到新状态。此外,您可以使用输入的名称作为状态键,这样您就不必为每个输入重写:
props.setFormState({
…this.props.formState,//在中复制props.formState
[evt.target.name]:evt.target.value//使用输入名称作为状态键
});
建议:
您可以考虑将状态合并到父组件:
// parent component
const [formState, setFormState] = React.useState({});
const onFieldChange = (field, value) => {
setFormState({
...formState,
[field]: value
});
}
return (
<MyFormComponent
formState={formState}
onFieldChange={onFieldChange}
/>
);
如果要包含
this.props.formState
,可以将对象扩展到新状态。此外,您可以使用输入的名称作为状态键,这样您就不必为每个输入重写:
props.setFormState({
…this.props.formState,//在中复制props.formState
[evt.target.name]:evt.target.value//使用输入名称作为状态键
});
建议:
您可以考虑将状态合并到父组件:
// parent component
const [formState, setFormState] = React.useState({});
const onFieldChange = (field, value) => {
setFormState({
...formState,
[field]: value
});
}
return (
<MyFormComponent
formState={formState}
onFieldChange={onFieldChange}
/>
);
我不知道setFormState函数是什么样子的,但是使用传统的状态,您只需要发送更改的属性。如果必须全部指定,至少可以通过分解前面的对象`props.setFormState({…props.formState,title:evt.target.value}),使其更加简洁;这将使所有以前的属性位于同一级别,包括标题,然后由您显式设置的标题覆盖。感谢您提出“最佳实践”风格的特定问题。我发现许多有启发性的答案,如下面的。我不知道setFormState函数是什么样子,但对于传统状态,您只需要发送更改的属性。如果必须全部指定,至少可以通过分解前面的对象`props.setFormState({…props.formState,title:evt.target.value}),使其更加简洁;这将使所有以前的属性位于同一级别,包括标题,然后由您显式设置的标题覆盖。感谢您提出“最佳实践”风格的特定问题。我发现很多答案都很有启发性,比如下面的。非常有魅力,谢谢你,至少可以帮我删掉40行。太好了。我添加了一些关于将州合并的建议。请参阅更新的答案。更好,很好的解决方案。效果很好,谢谢,这对我来说至少可以减少40行。太好了。我添加了一些关于将州合并的建议。请参阅更新的答案。更好、更好的解决方案。