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

Javascript 什么';在React.js中改变复杂状态的最佳方法是什么?,javascript,reactjs,Javascript,Reactjs,下面是一个简单的React组件,它呈现一个列表,当单击列表项时,该项会添加一个名为selected的类名 var CX = React.addons.classSet; var List = React.createClass({ getInitialState: function(){ return { items: this.props.items } }, handleItemClick: function(item){ item.isSe

下面是一个简单的React组件,它呈现一个列表,当单击列表项时,该项会添加一个名为
selected
的类名

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);
var CX=React.addons.classSet;
var List=React.createClass({
getInitialState:函数(){
返回{
项目:this.props.items
}
},
handleItemClick:功能(项目){
item.isSelected=true;
//砍
这个.forceUpdate();
},
render:function(){
var self=这个;
var items=this.state.items.map(函数(项,索引){
var className=CX({
'item':true,
“选定”:item.isSelected
});
返回(
  • item.name
  • ); }); 返回(
      {items}
    ); } }); 可变项目=[{ 名称:'苹果', 价值:1 }, { 名称:“Microsoft”, 价值:2 }]; React.renderComponent(,document.body);
    问题是,由于
    状态
    是一个包含对象数组的引用类型,并且在我的事件处理程序
    handleItemClick
    中,我只得到相应的
    。我当前直接修改
    ,然后调用
    this.forceUpdate()
    ,结果与预期一致

    然而,正如React文档所示,直接改变
    状态是一种不好的行为,我遇到了另一种方法,它使用
    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
    

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

    我可能错了(没有真正使用
    React.addons.update
    ),但我猜它看起来像
    var index=this.state.items.indexOf(item);var突变={};突变[index]={isSelected:{$set:true};var newData=React.addons.update(this.state.items,mutation)。如果您绑定索引而不是项目,则会更简单。这太棒了,非常感谢!!我已经建立了一个详细阐述你建议的模型@FelixKling也许你可以把评论移到回答区,然后我就可以接受了。