Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在不使用Flux或Redux的情况下使用Immutable.js_Reactjs_Redux_Flux_Immutable.js - Fatal编程技术网

Reactjs 在不使用Flux或Redux的情况下使用Immutable.js

Reactjs 在不使用Flux或Redux的情况下使用Immutable.js,reactjs,redux,flux,immutable.js,Reactjs,Redux,Flux,Immutable.js,我一直在乱搞一些代码,我想我刚刚意识到一些愚蠢的事情。在React with 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.

我一直在乱搞一些代码,我想我刚刚意识到一些愚蠢的事情。在React with 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方法,但由于我单独比较了这些道具,并且因为它们是原语(字符串和布尔等原语无论如何都不可能是不变的),所以我认为这并不重要,即使我没有使用它们,它也可能会起作用

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。

不可变的
与Redux或Flux无关

您可以使用Flux和Redux而不使用
不可变
,也可以使用
不可变
而不使用Flux和Redux

Immutable
有助于促进基于不可变数据结构的良好编程风格。这就是全部。这种编程风格非常适合函数式编程和React


Immutable
不是唯一一个这样做的框架。Javascript有自己的
Object.freeze
方法,该方法使对象在没有额外容器的情况下不可变。您还可以使用和其他工具。

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

但是它没有用,因为你不能对不可变的对象使用setState。@aLex为什么你认为你不能对不可变的对象使用
setState
?因为除非我用toJS()将它转换回javascript对象,否则它不起作用。到底什么不起作用?React不关心您保存到
状态的内容。请使用无效的代码更新问题。您没有正确使用库。。。与Flux/Redux无关。