2

Are there any approaches when using both immutable.js and redux-form that don't require calling .toJS()?

I can see the suggested approach on this issue is to call .toJS() on the Map object before passing it to the form:

getFormState: (state, reduxMountPoint) => state.get(reduxMountPoint).toJS()

Does this not compromise the performance benefit you get from using immutable.js and limit memoization?

I'm interested to know the performance impact of this, will it still be worth using immutable.js in a form heavy application? Are there any other approaches that don't rely on .toJS()?

4

3 回答 3

4

在考虑 redux-form 的未来时,我一直在考虑是否在内部使用 ImmutableJS。我短暂地接受了这样一个想法,即我可以通过某种外观以某种方式让相同的代码库使用两者来工作,但是最后,接口太不同了,ImmutableJS 接口更加冗长,因为不喜欢原生语言语法。

使用 ImmutableJS制作一个替代版本redux-form几乎需要更改每一行代码,这将是维护的噩梦。

除非有人能告诉我,使用 ImmutableJS 的性能优势超过了给选择.toJS()使用 ImmutableJS的人(大多数?)带来负担的成本,否则我认为更好的做法是,像 Redux 本身一样,保持不-对存储库有意见。

还有其他不依赖的方法.toJS()吗?

因此,要回答您的问题:不,如果管理您的 Redux reducers 的库需要普通的 javascript 对象,并且您将 ImmutableJS 用于您的 Redux 存储,那么您必须自己进行转换。

希望有更好的答案...

编辑:Redux Form 版本 6 支持 ImmutableJS 开箱即用。

于 2016-02-25T15:22:37.827 回答
2

正如 Erik 提到的,不幸的是,Redux-Form 还没有内置的解决方案,部分原因是表单状态和模型状态是一起烘焙的,而不是单独的实体。

如果您对分离表单和模型状态感到满意,那么让您使用 Immutable.JS 的模块化解决方案变得更加可行。这就是我创建React-Redux-Form的原因。

这是使用 React-Redux-Form 拥有不可变模型缩减器的方法:

import { createStore, combineReducers } from 'redux';
import { createModelReducer } from 'react-redux-form/lib/immutable';
import Immutable from 'immutable';

const store = createStore(combineReducers({
  'user': createModelReducer('user', Immutable.Map())
}));

export default store;

如果你有一个现有的 Immutable reducer 来代表你的模型,你可以用 Immutablemodeled()装饰器来装饰它:

import { createStore, combineReducers } from 'redux';
import { modeled } from 'react-redux-form/lib/immutable';

// existing immutable reducer
import userReducer from '../reducers/user-reducer';

const store = createStore(combineReducers({
  'user': modeled(userReducer, 'user')
}));

export default store;
于 2016-02-28T16:46:44.390 回答
0

您可以通过从 redux-form/immutable 而不是 redux-form 导入来使用 redux-form 的“不可变”版本。
这是链接: http ://redux-form.com/6.4.3/examples/immutable/

于 2017-01-05T10:30:02.970 回答