Javascript 设置状态钩子更改另一个状态

Javascript 设置状态钩子更改另一个状态,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我是新来的。我有下一个问题 在我的功能组件中,我有许多状态,其中有两个具有sames字段(一个用于辅助操作) 现在,我有一个调用函数的按钮,这个函数只编辑“fieldsToEdit”,但它也在编辑auxFields!在setState调用之后和之前,我实现了编写console.logs const updateEditHandler = (event) => { event.persist()); setFieldsToEdit((prevState) => {

我是新来的。我有下一个问题

在我的功能组件中,我有许多状态,其中有两个具有sames字段(一个用于辅助操作)

现在,我有一个调用函数的按钮,这个函数只编辑“fieldsToEdit”,但它也在编辑auxFields!在setState调用之后和之前,我实现了编写console.logs

const updateEditHandler = (event) => {
  event.persist());


     setFieldsToEdit((prevState) => {
           const { name, value } = event.target;
           if(name === "fecha_presentacion")
              prevState[name] = value;
           else
              prevState[name] = Number(value);
           return ({
              ...prevState
         });
}
我做错了吗?希望你能帮助我

     setFieldsToEdit((prevState) => {
       const { name, value } = event.target;
       if(name === "fecha_presentacion")
          prevState[name] = value;
       else
          prevState[name] = Number(value);
       return ({
          ...prevState
     });
在prevState[name]=您正在改变状态。如果您不熟悉lodash,则需要对其进行克隆并使用lodash deepClone或JSON.stringify进行设置,然后使用JSON.parse进行设置。 您没有共享代码,因此useState({….})没有任何意义。 但是从你的代码中我得到的一般情况来看,我认为fieldsToEdit和auxFields具有相同的引用,因为你的prevState[name]=你正在更改这两个字段 尽量不要在任何框架中改变你的状态

在prevState[name]=您正在改变状态。如果您不熟悉lodash,则需要对其进行克隆并使用lodash deepClone或JSON.stringify进行设置,然后使用JSON.parse进行设置。 您没有共享代码,因此useState({….})没有任何意义。 但是从你的代码中我得到的一般情况来看,我认为fieldsToEdit和auxFields具有相同的引用,因为你的prevState[name]=你正在更改这两个字段
尽量不要在任何框架中改变你的状态

你不应该改变状态。而是在不修改前一个对象的情况下创建新对象

prevState[name] = value; 
return { ...prevState };
上面的语句首先对前一个状态进行变异,然后返回它的一个副本。而是返回一个包含新值的副本,而不修改以前的状态

return { ...prevState, [name]: value };
上面复制了以前的状态,并使用
值添加或覆盖(已计算的)
名称
属性。这一切都是在不改变
prevState
的情况下完成的

将此应用于实际代码,您将得到以下结果

setFieldsToEdit((prevState) => {
  const { name, value } = event.target;
  
  if (name == "fecha_presentacion") {
    return { ...prevState, [name]: Number(value) };
  } else {
    return { ...prevState, [name]: value };
  }
});

// or (depending on preference)
setFieldsToEdit((prevState) => {
  let { name, value } = event.target;
  if (name == "fecha_presentacion") value = Number(value);
  return { ...prevState, [name]: value };
});

你不应该改变状态。而是在不修改前一个对象的情况下创建新对象

prevState[name] = value; 
return { ...prevState };
上面的语句首先对前一个状态进行变异,然后返回它的一个副本。而是返回一个包含新值的副本,而不修改以前的状态

return { ...prevState, [name]: value };
上面复制了以前的状态,并使用
值添加或覆盖(已计算的)
名称
属性。这一切都是在不改变
prevState
的情况下完成的

将此应用于实际代码,您将得到以下结果

setFieldsToEdit((prevState) => {
  const { name, value } = event.target;
  
  if (name == "fecha_presentacion") {
    return { ...prevState, [name]: Number(value) };
  } else {
    return { ...prevState, [name]: value };
  }
});

// or (depending on preference)
setFieldsToEdit((prevState) => {
  let { name, value } = event.target;
  if (name == "fecha_presentacion") value = Number(value);
  return { ...prevState, [name]: value };
});

要记住的一件事是不要改变
状态
。在那之后,你需要把整个代码放进去,这样我们就可以看到发生了什么。要记住的一件事是不要改变
状态。在那之后,你需要把整个代码放进去,这样我们就可以看到那里发生了什么。我以前从未见过
useState
hook的
set
函数将另一个函数作为参数。我假设这会将函数设置为
fieldsToEdit
,而不是执行它并保存返回值?@DBS如果新状态是使用以前的状态计算的,则应该传递回调。请看文档和文档。啊,很酷,我浏览了文档,显然完全错过了相关部分。很高兴知道这是一个选择。谢谢,为什么我不能改变状态?(对无知表示抱歉)。我会在几天后尝试这个解决方案,因为我要开始我的假期,我会在我回来时通知你:)@NicolasVillacorta不带括号的变量不会被计算,它会变成文本
name
,而不是变量
name
的内容。请参阅:我以前从未见过
useState
hook的
set
函数将另一个函数作为参数。我假设这会将函数设置为
fieldsToEdit
,而不是执行它并保存返回值?@DBS如果新状态是使用以前的状态计算的,则应该传递回调。请看文档和文档。啊,很酷,我浏览了文档,显然完全错过了相关部分。很高兴知道这是一个选择。谢谢,为什么我不能改变状态?(对无知表示抱歉)。我会在几天后尝试这个解决方案,因为我要开始我的假期,我会在我回来时通知你:)@NicolasVillacorta不带括号的变量不会被计算,它会变成文本
name
,而不是变量
name
的内容。见: