【问题标题】:Setting the state several times inside useEffect sets the last one only在 useEffect 中多次设置 state 只设置最后一个
【发布时间】:2020-09-11 02:31:33
【问题描述】:

我有一个组件,它有一个添加新项目的表单,并且它还应该更新现有项目。我正在尝试设置表单字段的值,这样如果用户选择编辑一个项目,他将在表单中拥有现有项目的所有数据,他只需要编辑这些数据。

我为此使用useEffect

useEffect(() => {
    if(props.editedItem)
    {
        inputChangedHandler(props.editedItem.companyName, "company");
        inputChangedHandler(props.editedItem.name, "name");
        inputChangedHandler(props.editedItem.description, "description");
    }
  }, [props.editedItem])

inputChangedHandler 方法是设置特定字段(公司、名称、描述)的表单值:

const inputChangedHandler = (newVal, inputIdentifier) => 
{
    const updatedOrderForm = {
        ...formSettings
    };
    const updatedFormElement = { 
        ...updatedOrderForm[inputIdentifier]
    };
    updatedFormElement.value = newVal;
    updatedOrderForm[inputIdentifier] = updatedFormElement;
    setFormSettings(updatedOrderForm);
}

这里的问题是只更改了最后一个字段(代码情况下的描述)。如果我更改了行顺序并且“名称”将是最后一个,则会出现名称信息而不是描述。

我该如何解决?

【问题讨论】:

  • 请显示inputChangedHandler方法
  • 添加方法

标签: reactjs use-effect use-state


【解决方案1】:

不确定您的 inputChangedHandler 方法定义如何,但您可以获取该值并使用相应的挂钩进行设置。

function inputChangedHandler({companyName,name, description}){
  setName(name);
  setCompanyName(companyName);
  ...

}
 useEffect(() => {
    if(props.editedItem)
    {
        inputChangedHandler(...props.editedItem);
    }
  }, [props.editedItem])

【讨论】:

  • 用所有集合调用方法和在使用效果里面有什么区别?
  • 我不确定您的 inputChangedHandler 方法定义如何。您能否提供有关该方法的更多信息?
  • 你能发布你的 useState 钩子来设置名称、描述和其他值吗
  • 那是我添加的方法。最后一行是为特定字段设置新值
【解决方案2】:

您可能会用过时的值覆盖您的表单(由于closures)。

// closure on `updatedOrderForm` value, staled state
const updatedFormElement = { 
   ...updatedOrderForm[inputIdentifier]
};

尝试使用提供最新状态的functional update

const inputChangedHandler = (newVal, inputIdentifier) => {
  setFormSettings((prev) => {
    const updatedOrderForm = {
      ...formSettings,
    };

    const updatedFormElement = {
      ...updatedOrderForm[inputIdentifier],
      value: newVal,
    };

    return { ...prev, [inputIdentifier]: updatedFormElement };
  });
};

【讨论】:

  • 确实如此
  • 出于好奇,我是像您一样使用扩展运算符还是像在原始代码中那样继续分别设置值和 updatedFormElement 是否重要?
  • 它们都有相同的效果,但是你所做的很容易出错,因为它只有在你改变状态 ...updatedOrderForm[inputIdentifier]copy 时才会起作用(使复制)。见reactjs.org/docs/…
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 2015-10-28
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多