ReactJS - Array中Object键的setState

Ell*_*ary 9 javascript reactjs

所以我一直在研究这个问题,并认为最好重构我的代码,以便将状态设置为一个对象数组.我想要做的是按一下按钮增加一个数字.

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

我的初始状态如下:

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
        },
      ]
    }
Run Code Online (Sandbox Code Playgroud)

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

我在这里尝试了类似于这个线程的东西,但我一直在收到错误.

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

Rad*_*nik 23

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

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

注意:这会改变状态.以下是没有变异的方法:

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);
Run Code Online (Sandbox Code Playgroud)

  • 在反应文档之后,一切都应该在 setState( oldState => your code ) 中完成 (2认同)
  • @ПавелЗорин:将数组索引设置为给定值(“array[index] = value”)正在修改数组。我们无法更改它,因此我们必须(浅)复制数组 - [`slice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ slice)是一个很好的方法。 (2认同)

Vin*_*rão 9

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

this.state.array[i].prop = 'newValue';
this.setState({ array: this.state.array });
Run Code Online (Sandbox Code Playgroud)

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

- 编辑 -

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

const array = this.state.array.slice();
array[i].prop = 'newValue';
this.setState({ array });
Run Code Online (Sandbox Code Playgroud)

-- 编辑 2 --

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

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