Reactjs shouldComponentUpdate中的清洁道具比较

Reactjs shouldComponentUpdate中的清洁道具比较,reactjs,immutable.js,Reactjs,Immutable.js,在使用Immutable.js时,我注意到当您使数组不可变时,数组中的所有元素都成为不可变对象的一部分,因此如果您更改其中一个元素,所有元素都将被视为新元素,这当然会触发数组中所有元素的重新排序,这是不好的 const taskList = [ { name: 'task 1', priority: '1', isDone: false }, { name: 'task 2', priority: '1', isDone: false }, {

在使用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方法可以确保正确的“可变性”,如果这有意义的话。

看看1)如何从数组中定义不可变对象的代码会很有用。2) 如何“更改其中一个元素”以及3)如何将此对象绑定到React组件的道具。“所有元素数组都成为不可变对象的一部分,因此如果更改其中一个元素,所有元素都将被视为新的”——这一假设是错误的,或者您更改元素的方式是错误的。只有数组的引用和已更改的元素应该不同。当我比较this.state和nextState时,无论发生什么情况,我都会得到true。两者都是带有道具的阵列。