什么'这是在React.js中改变复杂状态的最佳方法

What's the best way to mutate complex state in React.js?

本文关键字:复杂 改变 状态 方法 最佳 js React 什么      更新时间:2023-09-26

这里有一个简单的React组件,用于呈现列表,当单击列表项时,该项会添加一个名为selected的className。

var CX = React.addons.classSet;
var List = React.createClass({
  getInitialState: function(){
    return {
      items: this.props.items
    }
  },
  handleItemClick: function(item){
    item.isSelected = true;
    //hack
    this.forceUpdate();
  },
  render: function(){
    var self = this;
    var items = this.state.items.map(function(item, index){
      var className = CX({
        'item': true,
        'selected': item.isSelected
      });
      return (
        <li key={index} 
            onClick={self.handleItemClick.bind(self, item)}
            className={className}>
            item.name
        </li>
      );
    });
    return (
      <ul>
        {items}
      </ul>
    );
  }
});
var items = [{
  name: 'Apple',
  value: 1
}, {
  name: 'Microsoft',
  value: 2
}];
React.renderComponent(<List items={items} />, document.body);

问题是,由于state是一个包含对象数组的引用类型,而在我的事件处理程序handleItemClick中,我只得到相应的item。我现在直接突变item然后调用this.forceUpdate(),结果如预期。

然而,正如React文档所示,直接更改state是一种糟糕的行为,我遇到了另一种使用React.addons.update更改复杂对象的方法,但我没有让它工作。

那么,有人能告诉我如何正确地进行这种突变吗?提前感谢!

React.addons.update

我可能错了(还没有真正使用React.addons.update),但我想它看起来有点像

var index = this.state.items.indexOf(item);
var mutation = {}; // can't have dynamic keys in object literals :( [ yet :) ]
mutation[index] = {isSelected: {$set: true}};
var newData = React.addons.update(this.state.items, mutation);
// `mutation` looks something like
// {0: {isSelected: {$set: true}}}
// i.e. set `isSelected` of the element at index 0 to true

如果绑定索引而不是项,则会简单一些。