Javascript 什么';在React.js中改变复杂状态的最佳方法是什么?
下面是一个简单的React组件,它呈现一个列表,当单击列表项时,该项会添加一个名为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
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也许你可以把评论移到回答区,然后我就可以接受了。