【问题标题】:Setting state using Object.assign is losing keys in the state使用 Object.assign 设置状态正在丢失状态中的键
【发布时间】:2017-01-10 06:00:21
【问题描述】:

首先让我说我是 React 的菜鸟。

我在 componentDidMount 中获取数据准备/设置我的状态。我有一个远程 API 端点,它输出 JSON 数据,它看起来像这样。

  "popup": {
    "background": "bg",
    "url": "",
    "title": {
      "text": "title",
      "color": "#222",
      "bgColor": "#fff"
    },
    "button": {
      "text": "button",
      "color": "#222",
      "bgColor": "#567834"
    },
    "termsAndConditions": {
      "text": "termsAndConditions",
      "color": "#222",
      "bgColor": "#fff"
    }
  }

并基于这些数据,我正在渲染一个无状态组件,我正在将 props 传递给它。

这就是我的初始状态

this.state = {
  popup: {
    background: "",
    button: {
      color: "",
      bgColor: "",
      buttonRounded: false,
      text: "",
    },
    termsAndConditions: "",
    title: {
      bgColor: "",
      color: "",
      text: ""
    }
  }
}

现在是时候从表单中更新“标题”部分的值了。所以我设置它的状态是这样的

   handlePopupTitle(e) {
    this.setState({
      popup: {
        title: {
          text: e.target.value.trim()
        }
      }
    })
   }

但是,很快我就意识到 React 将覆盖我当前的状态并只离开

popup: {
  title: {
   text: "whatever my input value is"
  }
}

所以,我使用 Object.assign 创建了一个新对象并使用它来设置一个状态,因为改变你的状态显然是一个很大的问题。

现在我的事件处理程序看起来像这样

handlePopupTitle(e) {

  const newState = Object.assign( {}, this.state.popup, {
    title: {
      text: e.target.value
    }
  })

  this.setState({
    popup: newState
  })

}

但现在的问题是我只更新 'title' 对象中的 'text' 键,而所有其他键如 'color'、'bgColor' 都丢失了,因为我只设置了 'text'。

我尝试将 Object.assign 放在另一个 Object.assign 中,但它对我来说似乎不是一个理想的解决方案。还有一点需要注意的是,我无法更改状态的嵌套结构,因为我的数据结构不会更改。

谢谢

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    更简单的解决方案是使用immutability-helper npm 包。

    import update from 'immutability-helper';
    
    .....
    
    
    var newState = update(state, {
      popup: {
        title: {
          text: {
            $set: e.target.value;
          }
        }
      }
    })
    

    查看this doc了解更多信息

    【讨论】:

    • 我也使用过它,但后来我在控制台中看到一个未捕获的错误,说对象作为 React 子对象无效(找到:带有键 {text、color、bgColor} 的对象)。如果您打算渲染一组子项,请改用数组或使用 React 附加组件中的 createFragment(object) 包装对象“我不知道这是什么意思,所以我认为我做错了什么,所以我恢复了我的代码
    • Shubham,我确信这个错误与我在无状态组件中呈现状态的方式有关。如果我的状态像一个数组,这不会发生,但我别无选择。
    • 但是,您已经回答了我的问题,所以我会接受它作为最佳答案。谢谢大佬
    • 所以你的意思是你的问题已经解决了或者有另一个错误
    • 还有另一个错误,但这与我的状态结构有关。它是一个嵌套对象。因此,我得到 Objects are not valid as a React child (found: object with keys {text, color, bgColor})。如果您打算渲染一组子对象,请改用数组或使用 React 附加组件中的 createFragment(object) 包装对象
    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 2018-12-19
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多