【问题标题】:updating array in object properties更新对象属性中的数组
【发布时间】:2018-11-13 14:37:27
【问题描述】:

我有一个这样定义的对象:

import React, { Component } from 'react';
import './App.css';

class App extends Component {

  constructor() {
    super();
    this.state = {
    lists: ["Dogs", "Cats"],
    items: {Dogs:[], Cats:[]}
    };
  }

  handleAddItem(item) {
    console.log(this.props.idName);
    console.log(item);
  }

我有变量

console.log(this.props.idName)// output: Dogs
console.log(item);// output {name: "lofi"}  

我不知道如何更新对象项{}以使其变成这样:

items{Dogs:[{name: "lofi"}], Cats:[]}

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

你可以这样做

import React, { Component } from 'react';
import './App.css';

class App extends Component {

  constructor() {
    super();
    this.state = {
    lists: ["Dogs", "Cats"],
    items: {Dogs:[], Cats:[]}
    };
  }

  handleAddItem(item) {
    console.log(this.props.idName);
    console.log(item);
    let oldItems = this.state.items;
    oldItems[this.props.idName].push(item);
    // Update new state for items
    this.setState({
      items: {...this.state.items}
    })

  }

【讨论】:

  • 正在更新前一个状态变量,以使其准备好更新下一个状态。您可以在 this.setState 调用中看到扩展运算符,它会更新它的反应方式。让我更新答案以使其清楚。
  • 您可以在 setState 中传递函数,您可以在其中访问 oldState 而不必保存以前的状态值,请查看文档:reactjs.org/docs/react-component.html#setstate
  • 这可能会损坏数据! setState 调用将覆盖另一个类别!
  • @lipp。怎么会?
  • @agent_hunt this.state.items 被完全替换。如果this.state.items.Cats = [{name: 'foo'}]idName = 'Dogs',“猫”将被删除。也就是说:我刚刚注意到,您缺少“一个级别”。例如this.state.items.Cats = [{name: 'foo'}] ... 而不是 this.state.items = [{name: 'foo'}]
【解决方案2】:

这样的事情呢

handleAddItem(item) {
    this.setState((s, p) => ({
        items: {
            ...s.items,
            [p.idName]: s.items[p.idName].concat([item])
        }
    }))
}

几个cmets:

  • setState 可以带函数,作为参数你得到旧的状态值
  • [idName]: value 动态更新道具 idName

【讨论】:

    【解决方案3】:

    要更新嵌套的 Array 子状态,可以使用扩展运算符附加元素

    handleAddItem = item => {
      this.setState((prevState, props) => ({
        items: {
          ...prevState.items,
          [props.idName]: [
            ...prevState.items[props.idName],
            item
          ]
        }
      }))
    }
    

    【讨论】:

    • 在这种情况下最好使用带有回调函数的setState:reactjs.org/docs/react-component.html#setstate
    • 来自 React 文档 - this.propsthis.state 可能会异步更新,您不应依赖它们的值来计算下一个状态。
    • 是的。对于诸如递增之类的事情,我明白了这一点,您的解决方案会是什么样子?我没有看到更“原子”的方式来做到这一点。
    • 我收到此错误 App.js:5 Uncaught TypeError: Cannot convert undefined or null to object
    • @amaj 感谢您指出这一点!好手表!我相应地更新了代码。您的示例未使用更新程序函数中的道具,因此您也可以修复您的代码:)
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多