[英]What's the best way to mutate complex state in React.js?
这是一个简单的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
),但我猜它看起来像
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
如果绑定索引而不是项目,则会更简单一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.