Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 使用React钩子返回动态创建的嵌套对象的上一个状态?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 使用React钩子返回动态创建的嵌套对象的上一个状态?

Javascript 使用React钩子返回动态创建的嵌套对象的上一个状态?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个状态对象,我想动态创建一个键和键内的一个对象。它需要是一个对象,以便对父组件是动态的,并返回以前的状态。键是基于父组件的动态键。现在的setState按预期工作,创建状态的动态部分,但是,在嵌套对象中返回状态是我感到困惑的地方。截至当前的状态将覆盖上一个状态 这里有一些代码 import React, { useState, useCallback } from "react"; import { FormGroup, CustomInput } from "

我有一个状态对象,我想动态创建一个键和键内的一个对象。它需要是一个对象,以便对父组件是动态的,并返回以前的状态。
键是基于父组件的动态键。现在的
setState
按预期工作,创建状态的动态部分,但是,在嵌套对象中返回状态是我感到困惑的地方。截至当前的状态将覆盖上一个状态

这里有一些代码

import React, { useState, useCallback } from "react";
import { FormGroup, CustomInput } from "reactstrap";
import UniqueString from "unique-string";

function Ratings({ parentCheckedGood, parentCheckedNA, question, section }) {
  const [state, setState] = useState({});
  //THE ISSUE IS INSIDE THIS ONCHANGE FUNCTION
  const onChange = useCallback(
    (e) => {
      const { name, value } = e.target;
      // The state structure works as expected but getting the previous nested state is the issue
      setState((state) => ({
        ...state,
        [section]: { ...state[section], [question]: value },
      }));
    },
    [section, question]
  );
  console.log(state);
  const string = UniqueString();
  return (
    <div>
      <FormGroup required>
        <div>
          <CustomInput
            // checked={parentCheckedGood}
            onChange={onChange}
            type="radio"
            id={string + "1"}
            name={question}
            value="Good"
            label="Good"
          />
          <CustomInput
            onChange={onChange}
            type="radio"
            id={string + "2"}
            name={question}
            value="Fair"
            label="Fair"
          />
          <CustomInput
            onChange={onChange}
            type="radio"
            id={string + "3"}
            name={question}
            value="Poor"
            label="Poor"
          />
          <CustomInput
            // checked={parentCheckedNA}
            onChange={onChange}
            name={question}
            type="radio"
            id={string + "4"}
            value="N/A"
            label="N/A"
          />
        </div>
      </FormGroup>
    </div>
  );
}

export default Ratings;
回答:


在做了一些调试之后,我发现我的方法是正确的。我在父级中有另一个onChange函数,它与setState冲突。如果有人正在寻找一种动态的方法来创建一个状态,那么这可能是最好的方法。不创建额外的设置状态。

所有customInput共享相同的状态;如果childen组件返回具有相同密钥的状态,则它们将覆盖上一个密钥

所有customInput共享相同的状态;如果childen组件返回具有相同密钥的状态,则它们将覆盖上一个密钥

这个setState的工作方式是创建一个动态键,这样它就不会在它的第一个实例上迭代。因此,此函数可以处理多个输入。您可以发布一个状态示例,当前状态示例和上一个状态示例,我并没有真正感到困惑。我为你和跟随这篇文章的任何人添加了答案。这个setState的工作方式是它创建一个动态键,这样它就不会在它的第一个实例上迭代。因此,这个函数能够处理多个输入。你可以发布一个状态示例,当前状态和上一个状态,我并没有真正感到困惑。我为你以及任何关注这篇文章的人添加了答案。
state = {
    section: {name: value}
  }