当使用带有immutable-js的redux时 - 你在选择器上调用了JS()吗?或者你在渲染函数中使用.get('prop')?

Ada*_*Tal 5 optimization reactjs immutable.js redux reselect

现在我正在reselect创建我的选择器来从商店中提取数据并将其传递给propsvia connect.为简单起见,我的选择器的结果总是一个JS对象(toJS()在选择器的末尾调用),如下所示:

const selector = state => state.get('data').toJS();
Run Code Online (Sandbox Code Playgroud)

现在我正在努力改善一些性能,并且我意识到shouldComponentUpdate浅层比较失去了不变性的优点,因为我从选择器返回的方式.

另一方面,.get('prop')在我的HTML内部使用似乎非常烦人:

<div>{this.props.data.get('prop')}</div>
Run Code Online (Sandbox Code Playgroud)

特别是如果我有一个将简单的JS对象传递给可变的子组件的情况,如下所示:

<ChildComponent totalItems={10} />
Run Code Online (Sandbox Code Playgroud)

然后在访问道具时没有一致性(一些是可变的,一些是不可变的).

我想创建一个辅助unwrap函数,如下所示:

const unwrap = obj => obj && obj.toJS ? obj.toJS() : obj;
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢这个解决方案..我真的不喜欢这些方法.

你用什么清洁代码和性能?

Ada*_*Tal 0

一年半后回到我的问题并给出我自己的答案:

如果可能,请始终传递不可变对象。如果它不是不可变的,则按原样传递它。

我认为性能比代码的漂亮程度更重要。

如果一个值是不可变的或可变的,我会按原样传递它,并且toJS如果不需要的话永远不会调用。fromJS如果可变值没有存储在 redux 存储中,我也不会包装它们。

我只需要知道在子组件内部有些 props 是不可变的,有些则不是 - 这实际上非常简单,因为几乎总是一个复杂的对象是不可变的。