Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Javascript 将Immutable.js映射转换为react组件内部的对象可以吗_Javascript_Reactjs_Redux_React Redux_Immutable.js - Fatal编程技术网

Javascript 将Immutable.js映射转换为react组件内部的对象可以吗

Javascript 将Immutable.js映射转换为react组件内部的对象可以吗,javascript,reactjs,redux,react-redux,immutable.js,Javascript,Reactjs,Redux,React Redux,Immutable.js,我在应用程序中使用redux和Immutable.js,在我开始开发项目几周后,我将Immutable添加到应用程序中,由于我不想将当前组件更改为Immutable的.get()语法,我将存储中的不可变映射转换为对象,然后在组件中使用它们。例: @connect((store) => { return { login: store.login.toObject(), user: store.user.toObject() }; }) 这是一种不好的做法吗?这与我的

我在应用程序中使用redux和Immutable.js,在我开始开发项目几周后,我将Immutable添加到应用程序中,由于我不想将当前组件更改为Immutable的.get()语法,我将存储中的不可变映射转换为对象,然后在组件中使用它们。例:

@connect((store) => {
  return {
    login: store.login.toObject(),
    user: store.user.toObject()
  };
})

这是一种不好的做法吗?这与我的应用程序的性能有关吗?

是的,这是一种非常不好的做法。为了让Immutable将您的不可变映射转换为JavaScript,它必须遍历整个对象;这将是缓慢的。此外,将ImmutableJS与React和Redux一起使用会失去大量实际价值。具体地说,您现在不能再使用的简单实现来缩短不必要的重新渲染。

如果您想使用ImmutableJS
映射,但不想使用
get
语法,您可以使用。它们具有
映射的所有功能,但不包括任意值键(访问器语法无论如何都无法使用)

一个简单的例子:

// Specify the allowed fields and their default values
const TodoListState = Immutable.Record({ todos: undefined, filter: undefined })

// Instantiate the record using `new` and an object with the desired KV mapping
const initialTodoState = new TodoListState({ 
  todos: Immutable.List(),
  filter: undefined, // this is already the default, but I prefer being explicit
})

const initialTodos = initialTodoState.todos // List()

你能详细说明一下短路技术在
shouldComponentUpdate
中会是什么样子吗?另外,是否有一种方法可以使用基于函数的React组件而不是基于类的组件来实现这一点?@NicholasMontaño如果您想要使用生命周期挂钩,您将需要使用ES6类。目前,
react-redux
自动实现了一个浅层比较,当您在
connect
中包装组件时,您可以免费获得该比较,因此,除非您想做一些更自定义的事情,否则您可以使用功能组件。