首页 > 解决方案 > 更新对象 Javascript 中的单个字段

问题描述

我需要更改problems对象中特定字段的状态:

  const [problems, setProblems] = useState({
    first_name: false,
    last_name: false,
    city: false,
    email: false,
    password: false,
  });

我在下面尝试了类似的方法,但它只更新了错误Object.keys(error.response.data)列表的最后一个值:

.catch((error) => {
        Object.keys(error.response.data).map((err) => {
          setProblems({ ...problems, [err]: true });
        });
      });

error 是一个对象,其键名与对象中的键名相同problems。我怎样才能正确地更新所有字段?

标签: javascriptobject

解决方案


它仅使用最后一个状态值更新状态是因为关闭了状态。

在组件的特定渲染中,状态是恒定的;为了看到更新的状态,组件必须重新渲染。

由于您setProblems()在同一个渲染中多次调用:

setProblems({ ...problems, [err]: true });

problems上述语句中的状态指的是调用时生效的相同状态。Object.keys(...).map(...)简而言之,您每次调用时都在传播相同的状态。setProblems

解决方案

你需要做的是:

  1. 首先创建要保存在状态的对象

    const newState = { ...problems };
    
    Object.keys(error.response.data)
          .forEach((err) => newState[err] = true);
    
  2. 调用状态设置器函数

    setProblems(newState);
    

推荐阅读