Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用多个关键点更改对象的单个值而不重复_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 使用多个关键点更改对象的单个值而不重复

Javascript 使用多个关键点更改对象的单个值而不重复,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我试图找到一种更简洁的方法来处理这种模式,在处理表单字段的更改时,我经常遇到react 对于我的表单对象中的每个元素,我处理一个值的变化,我发现我自己用useState()的setter函数复制了这个模式。我已经尝试过一些事情,比如创建formState的浅拷贝,并对其进行变异,但我能真正让事情正常运行的唯一方法是使用bellow模式,这感觉有点重复 const handleTitle = evt => { props.setFormState({ title: ev

我试图找到一种更简洁的方法来处理这种模式,在处理表单字段的更改时,我经常遇到react

对于我的表单对象中的每个元素,我处理一个值的变化,我发现我自己用useState()的setter函数复制了这个模式。我已经尝试过一些事情,比如创建formState的浅拷贝,并对其进行变异,但我能真正让事情正常运行的唯一方法是使用bellow模式,这感觉有点重复

 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行。太好了。我添加了一些关于将州合并的建议。请参阅更新的答案。更好、更好的解决方案。