React / Redux / Immutable.js - 不可变动作(错误:动作必须是普通对象)

时间:2017-10-23 13:25:42

标签: javascript reactjs react-redux immutable.js

我在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对象作为操作?我在文档中找不到它......

1 个答案:

答案 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在从旧的不可变对象创建时所提供的性能优势将是未实现的。