redux 形式和 immutable.js

redux-form and immutable.js

在同时使用 immutable.js 和 redux-form 时是否有不需要调用 .toJS() 的方法?

我可以看到关于 this issue 的建议方法是在 Map 对象上调用 .toJS(),然后再将其传递给表单:

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

这不会损害您从使用 immutable.js 和限制记忆中获得的性能优势吗?

我很想知道这对性能的影响,在表单繁重的应用程序中仍然值得使用 immutable.js 吗?还有其他不依赖 .toJS() 的方法吗?

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

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

除非有人能告诉我使用 ImmutableJS 的性能优势超过了将 .toJS() 负担交给选择 的人(大多数?)的成本使用 ImmutableJS,我认为更好的做法是像 Redux 本身一样,对存储库保持中立态度。

Are there any other approaches that don't rely on .toJS()?

所以,回答你的问题:不,如果管理你的 Redux reducer 的库需要普通的 javascript 对象,而你正在为你的 Redux 存储使用 ImmutableJS,你必须自己进行转换.

希望有更好的答案...

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

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

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

的原因

以下是使用 React-Redux-Form 获得不可变模型 reducer 的方法:

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,您可以使用 Immutable modeled() 装饰器对其进行装饰:

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;

您可以通过从 redux-form/immutable 而不是 redux-form 导入来使用 "immutable" 版本的 redux-form。
这里是 link: http://redux-form.com/6.4.3/examples/immutable/