什么'这是在React.js中改变复杂状态的最佳方法
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
我可能错了(还没有真正使用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
如果绑定索引而不是项,则会简单一些。
相关文章:
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 在Redux中,我应该在哪里编写复杂的异步流
- jQuery:当屏幕大小改变时,如何更改默认图像和悬停图像
- 将复杂对象从angular js传递到web api,它总是返回404
- dropdown.js中的复杂事件处理
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 相当复杂的Regex
- 用Javascript重新格式化复杂文本日期字符串的更好方法
- 为什么使用immutableJS我的状态没有改变
- 加速我的复杂函数绘图仪(canvas+javascript)
- JavaScript改变了双方的显示风格
- JQuery Mobile Javascript复杂方程式
- 改变所有<td>为特定的桌子点击颜色
- 变量dos'即使我可以返回更新后的值,也不会改变
- 如何使用javascript过滤复杂的json对象
- jQuery更改变量值
- 复杂量角器选择器
- 爆米花改变来源
- 什么'这是在React.js中改变复杂状态的最佳方法
- 将复杂对象从父对象传递给子对象.任何让父节点检测其输出何时改变的方法