首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有不变抛出的Redux.createStore“还原器不是一个函数(如何在Immutable.js和composeEnhancers中使用Redux )

使用带有不变抛出的Redux.createStore“还原器不是一个函数(如何在Immutable.js和composeEnhancers中使用Redux )
EN

Stack Overflow用户
提问于 2018-01-03 19:08:03
回答 1查看 2.2K关注 0票数 1

我编写了这段代码来创建Redux store

代码语言:javascript
复制
import {combineReducers} from 'redux-immutable'

const MyAppReducers = combineReducers({
    Node1: Node1Reducer,
    Node2: Node2Reducer,
    Node3: Node3Reducer,
    Node4: Node4Reducer
})

let store = createStore(
    MyAppReducers,
    composeEnhancers(
        applyMiddleware(
            thunkMiddleware,
            ApiMiddleware,
            loggerMiddleware
        )
    )
)

此配置的结果是一个普通对象,它包含在Immutable.Map()的内部:

代码语言:javascript
复制
{
    Node1: Immutable.Map(),
    Node2: Immutable.Map(),
    Node3: Immutable.Map(),
    Node4: Immutable.Map()
}

相反,我希望所有的状态树都是一个Immutable.Map()

因此,我试图直接将一个combineReducers()对象传递给Immutable.Map()对象:

代码语言:javascript
复制
const MyAppReducers = combineReducers(Immutable.Map({
    Node1: Node1Reducer,
    Node2: Node2Reducer,
    Node3: Node3Reducer,
    Node4: Node4Reducer
}))

但是这会在控制台中抛出一个错误:

Uncaught :减速器不是函数 在combineReducers.js:39 在Array.forEach () 在combineReducers.js:36 在Map.withMutations (immutable.js:1353) 在combineReducers.js:35 在computeNextEntry (2:27469) 在recomputeStates (2:27769) 电话:2:31382 按调度(createStore.js:165) 在createStore (createStore.js:240)

redux-immutable的文档指出,我应该将initialState作为createStore函数的第二个参数传递,但我的第二个参数目前是配置中间件和其他东西所需的composeEnhancers函数。

如何使整个状态树成为一个Immutable.Map() 对象?

EN

回答 1

Stack Overflow用户

发布于 2018-01-04 15:51:01

对于可能有同样问题的人来说,完全的解决办法是:

代码语言:javascript
复制
import {combineReducers} from 'redux-immutable'
import {fromJS} from 'immutable'
import { createStore, applyMiddleware } from 'redux';
import ThunkMiddleware from 'redux-thunk'
import {createLogger} from 'redux-logger'

const MyAppInitialState = fromJS({
    Node1: {
        entities: {},
        ui: {}
    },
    Node2: {
        entities: {},
        ui: {}
    },
    Node3: {
        entities: {},
        ui: {}
    },
    Node4: {
        entities: {},
        ui: {}
    }
})

const MyAppReducers = combineReducers({
    Node1: Node1Reducer,
    Node2: Node2Reducer,
    Node3: Node3Reducer,
    Node4: Node4Reducer
})

const LoggerMiddleware = createLogger()

const store = createStore(
    MyAppReducers,
    MyAppInitialState,
    composeEnhancers(
        applyMiddleware(
            thunkMiddleware,
            ApiMiddleware,
            loggerMiddleware
        )
    )
)

// Example of a reducer (just for completeness)
const Node1Reducer = (state = fromJS({entities: {}, ui: {}}), action) => {
    switch (action.type) {
        ...
        default:
            return state
    }
}

有了这个配置,我现在可以使用Immutable.jsRedux一起使用整个state作为Immutable树。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48083663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档