React/Redux集成Immutable遇state.get报错,请求定位问题
问题分析与解决方案
咱们先拆解下为啥会报state.get is not a function这个错:
你用的是Redux原生的combineReducers,它合并出来的根状态是普通JavaScript对象,而非Immutable的Map实例。也就是说,整个state是个普通对象,只有state.UIreducer才是你用fromJS()创建的Immutable对象——普通对象当然没有.get()方法,这就是报错的根源。
接下来给你两种可行的解决方案:
方案一:保持现有配置,调整组件内状态访问方式
既然根state是普通对象,直接通过属性访问拿到Immutable子状态即可,后续在组件里用Immutable的API处理它:
const mapStateToProps = state => ({ UI: state.UIreducer // 这里UI是Immutable对象 })
在组件内使用时,要用Immutable的.get()方法获取属性:
// 比如在组件render中 console.log(this.props.UI.get('test'));
方案二:让整个根状态变为Immutable对象(适合全项目Immutable场景)
如果想让整个store的状态都保持Immutable结构,可以用redux-immutable库提供的combineReducers替代Redux原生的,这样根state本身就是Immutable Map,就能用.get()方法访问子reducer的状态了。
步骤:
- 安装依赖:
npm install redux-immutable # 或使用yarn yarn add redux-immutable
- 修改合并reducers的代码:
// 替换成redux-immutable的combineReducers import { combineReducers } from 'redux-immutable'; import { UIreducer } from './UI-reducer'; export default combineReducers({ UIreducer });
- 此时你的mapStateToProps写法就完全没问题了:
const mapStateToProps = state => ({ UI: state.get('UIreducer') })
这样调整后,根状态和子reducer状态都统一为Immutable结构,项目内的状态处理会更一致。
内容的提问来源于stack exchange,提问作者red house 87
相关产品推荐
相关产品推荐

