2017-04-19 24 views
1

我一直在搞一些代码,我想我只是意识到了一些愚蠢的东西。在没有Flux或Redux的情况下在React中使用Immutable.js是一个愚蠢的错误。在没有Flux或Redux的情况下使用Immutable.js

toggleTask(task) { 
    const found = _.find(this.state.taskList, task => task.name === task); 
    found.isDone = !found.isCompleted; 
    const index = _.findIndex(this.state.taskList, task => task.name === task); 

    const temp = Immutable.fromJS(this.state.taskList); 
    temp.setIn([index, 'isDone'], found.isDone).toJS(); 

    this.setState({ taskList: temp.toJS() }); 

} 

所以基本上我才意识到有多少傻瓜我是我是在制造一个不可变对象,改变了它使用Immutable.js方法再变回一个数组。它没用,因为浅比较应该没有不可变对象。

shouldComponentUpdate(nextProps) { 

    return (this.props.name !== nextProps.name || this.props.priority !== nextProps.priority || this.props.isDone !== nextProps.isDone ); 
} 

我一直在使用lodash方法,但由于我单独比较道具,因为他们原语(如字符串和布尔值不能immutables反正元),我不认为这真的事情,即使我没有使用它也可能会起作用。

toggleTask(task) { 
    const found = _.find(this.state.taskList, task => task.name === task); 
    found.isDone = !found.isDone; 
    this.setState({ taskList: this.state.taskList }); 
} 

所以我说错了,React中的Immutable.js在没有Redux或Flux的情况下是无用的吗?有没有我不正确的理解?我看过示例,因为我从未使用过Flux或Redux,所以它们对我来说并不合适。

+0

您没有正确使用库...与Flux/Redux无关。 – c0deNinja

回答

1

是的,你实际上是在正确的轨道上。为什么Immutable.js在Redux/Flux中更有用是因为Immutable.js允许您使用深嵌套的json对象进行廉价的浅层比较。这是它的主要优势。在你的情况中,我怀疑你有一个简单的待办事项应用程序,其中你的状态是一个简单数组列表,在这种情况下,你不会从使用Immutable.js中得到任何东西,因为你可以比较属性,这并不昂贵。你也许在Redux应用程序中不需要它,但是在大型项目中,你可能经常会有非常大的嵌套json对象,在这种情况下,Immutable.js非常有用。

+0

即使没有Redux/Flux,浅比较也很好。 – Sulthan

1

Immutable与Redux或Flux无关。

您可以在没有Immutable的情况下使用Flux和Redux,您可以在没有Flux和Redux的情况下使用Immutable

Immutable有助于促进基于不可变数据结构的良好编程风格。就这样。这种编程风格在函数式编程和React方面非常好。

Immutable不是唯一的框架在做同样的事情。 Javascript有它自己的Object.freeze方法,使对象不可变,没有额外的容器。您也可以使用icepick等。

+0

但是它没用,因为你不能用setState和Immutable对象。 – aLex

+0

@aLex你为什么认为你不能在一个不可变的对象上使用'setState'? – Sulthan

+0

因为它不起作用,除非我用toJS()将它转换回javascript对象。 – aLex

相关问题