我在Redux和Immutable.js中使用React - 我的状态由不可变对象组成,并且工作正常。
现在我尝试使用操作不可变对象而不是普通的Javascript对象。
我的reducers和action creators工作,我的所有单元测试都通过了,但是当我尝试在React组件中使用不可变的action对象时,我得到一个错误,因为我的Action对象是一个不可变的Map(而不是一个普通的javascript对象)
这是我的行动:
export const cancel = () => {
return Immutable.Map({
type: ACTION_TYPES.get('CANCEL')
})
}
我的reducer是这样的(在单元测试时有效但React从来没有因为错误而调用它):
export const site = (state = initialState, action) => {
const actionType = null
try {
action.get('type')
} catch (e) {
return state
}
switch (actionType) {
... so on and so forth ...
测试组件时出现以下错误:
FAIL src/App.test.js
● Test suite failed to run
Actions must be plain objects. Use custom middleware for async actions.
我需要添加哪些中间件才能使我的Immutable.js对象作为操作?我在文档中找不到它......
答案 0 :(得分:1)
我需要添加哪些中间件才能使我的Immutable.js对象作为操作?我在文档中找不到它......
如果要构建自定义行为,则需要自己构建中间件。像这样:
import { isImmutable } from 'immutable';
// Allows immutable objects to be passed in as actions. Unwraps them, then
// forwards them on to the reducer (or the next middleware).
const immutableMiddleware = store => next => action => {
if (isImmutable(action)) {
next(action.toJS())
} else {
next(action);
}
};
那就是说,我真的不知道从不可改变的对象做什么会带来什么好处。通常在需要时创建操作,并且从不再次访问操作,因此保护它免受突变几乎不会成为问题。而且你通常不会克隆它们,所以immutablejs在从旧的不可变对象创建时所提供的性能优势将是未实现的。