当使用Immutable.js时,我注意到当你创建一个数组不可变时,所有的元素数组都成为不可变对象的一部分,这样如果你改变其中一个元素,所有的元素都会被认为是新的,当然,会触发重新渲染数组中的所有元素,这很糟糕。
const taskList = [
{
name: 'task 1',
priority: '1',
isDone: false
},
{
name: 'task 2',
priority: '1',
isDone: false
},
{
name: 'task 3',
priority: '1',
isDone: false
}
];
var tl = Immutable.fromJS(taskList);
但是,我意识到元素本身的属性不是不可变的,因此在组件级别中,您可以实现这样比较所有元素属性的shouldComponentUpdate方法。
shouldComponentUpdate(nextProps, nextState) {
return (this.state !== nextState || this.props.name !== nextProps.name || this.props.priority !== nextProps.priority || this.props.isDone !== nextProps.isDone );
}
我测试了它并且它可以工作,但是这段代码不干净且维护起来不容易,所以我想知道是否有更清晰的实现。
shouldComponentUpdate(nextProps, nextState) {
return (this.state !== nextState || this.props !== nextProps );
}
如果您没有阅读,由于上述原因,上述内容无效。
toggleTask(task) {
const found = _.find(this.state.taskList, task => task.name === task);
found.isDone = !found.isDone;
this.setState({ taskList: this.state.taskList });
}
编辑:我听说使用带有Immutable.js的lodash可能是多余的,但我不确定哪种lodash方法确保正确的“可变性”,如果这是有道理的。