【问题标题】:ReactJS - setState of Object key in ArrayReactJS - 数组中对象键的 setState
【发布时间】:2016-05-12 11:58:22
【问题描述】:

所以我已经为此工作了一段时间,并认为最好重构我的代码,以便将状态设置为对象数组。我想要做的是在单击按钮时增加一个数字。

我在一个组件中有一个回调函数,它触发了一个更新状态的函数……但是我很难定位对象中的键值。

我的初始状态是这样的:

getInitialState: function() {
    return {
      items: [
        {
          links: 'zest',
          trackId: 1023,
          songTitle: 'z know the others',
          artist: 'zuvet',
          upVotes: 0
        },
        {
          links: 'alpha',
          trackId: 987,
          songTitle: 'ass',
          artist: 'arme',
          upVotes: 3
        },
      ]
    }

我正在尝试定位 upVotes 键,但不知道如何。我的函数传递一个键,以便我可以定位数组中的索引,但是当我尝试执行以下操作时:this.setState({items[key]: {upVotes: this.state.items[key].upVotes + 1}}) 由于意外的[ 令牌,它会引发错误。

我尝试过类似于此线程here 的内容,但我不断收到错误消息。

我可以编写什么样的函数来设置我想要定位的对象中的键的状态?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    获取当前状态,修改它并setState()它:

    var stateCopy = Object.assign({}, this.state);
    stateCopy.items[key].upVotes += 1;
    this.setState(stateCopy);
    

    注意:这会改变状态。以下是如何在没有突变的情况下做到这一点:

    var stateCopy = Object.assign({}, this.state);
    stateCopy.items = stateCopy.items.slice();
    stateCopy.items[key] = Object.assign({}, stateCopy.items[key]);
    stateCopy.items[key].upVotes += 1;
    this.setState(stateCopy);
    

    【讨论】:

    • 非常感谢!甚至没想过要抓住整个东西……非常感谢。对 React 来说仍然非常新,这有很大帮助。我会在几分钟内接受答案。你太快了:)
    • 很高兴能帮上忙。 (:
    • 在反应文档之后,一切都应该在 setState( oldState => 你的代码) 中完成
    • @RadosławMiernik 密钥从何而来??
    • @ПавелЗорин:将数组索引设置为给定值 (array[index] = value) 正在修改数组。我们无法更改它,因此我们必须(浅)复制数组 - slice 是这样做的好方法。
    【解决方案2】:

    考虑到您没有使用 immutable.js,可以直接编辑数组上的值并将状态设置为修改后的对象,即...

    this.state.array[i].prop = 'newValue';
    this.setState({ array: this.state.array });
    

    直接编辑的问题是 React 不知道状态已更改,更新生命周期不会触发。但是再次设置状态会强制更新。

    -- 编辑--

    如果状态是不可变的...

    const array = this.state.array.slice();
    array[i].prop = 'newValue';
    this.setState({ array });
    

    -- 编辑 2--

    感谢选择的答案,我意识到这仍然会改变元素,因为数组只包含对相关对象的引用。这是一个简洁的 ES6-y 方法。

    const array = [...this.state.array];
    array[i] = { ...array[i], prop: 'New Value' };
    this.setState({ array });
    

    【讨论】:

    • 我不知道这是否有充分的理由,但通常不鼓励在 this.setState() 调用之外直接改变状态。
    • sn-p 只是代码的一部分,所以我假设 i 将被定义,因为它是要变异的元素
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2020-09-20
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多