类型错误:state.getIn 不是函数
Posted
技术标签:
【中文标题】类型错误:state.getIn 不是函数【英文标题】:TypeError: state.getIn is not a function 【发布时间】:2020-07-11 09:03:09 【问题描述】:我在我的 react 项目中实现不可变,将它与 redux 一起使用,使用 fromJS() 函数(来自不可变库)使状态成为不可变对象。在我的 reducer 文件中,一切正常,我收到一个动作,我可以使用 setIn() 函数设置新值,我可以使用 getIn() 函数访问状态。
但是当我使用 mapStateToProps 从 connect() 函数获取状态时,即使 console.log 显示一个明显不可变的对象,我也不能使用不可变函数,例如 toJs() 或 getIn() 。我总是收到这个错误:TypeError: state.getIn is not a function
。
我的 index.js 文件
import React from 'react';
import connect from 'react-redux';
import compose from 'redux';
import PropTypes from 'prop-types';
import Button from '@material-ui/core/Button';
import template as templateAction from './actions';
import withReducer from '../../../reducer/withReducer';
import templateReducer from './reducer';
export const Template = ( name, template ) => (
<Button onClick=template>
name
</Button>
);
Template.propTypes =
name: PropTypes.string.isRequired,
template: PropTypes.func.isRequired,
;
export const mapStateToProps = (state) =>
console.log('state is equal to', state);
return (
name: state.getIn(['templateReducer', 'name']),
);
;
export const mapDispatchToProps = (dispatch) => (
template: () => dispatch(templateAction()),
);
export default compose(
withReducer('templateReducer', templateReducer),
connect(mapStateToProps, mapDispatchToProps),
)(Template);
console.log(state) 的结果
Result of console.log(state)
PS:当我不使用不可变状态时,一切正常。
【问题讨论】:
【参考方案1】:使用来自griddle-react
而不是react-redux
的连接。
【讨论】:
【参考方案2】:看起来mapStateToProps
函数内部的state
是一个对象,它的一个属性为“templateReducer”,其值为Map
类型。
我的 React 知识有点生疏,但分享 templateReducer
的代码可能会有所帮助。
withReducer('templateReducer', templateReducer)
对 reducer 函数有什么作用?
似乎它在将减速器的状态设置为键 templateReducer
之前将其发送到 mapStateToProps
函数。 (也许??)
在使用不可变方法之前更改此函数以访问 State 可能会消除错误。
export const mapStateToProps = (state) =>
console.log('state is equal to', state);
return (
name: state['templateReducer']?.getIn(['name']),
);
;
【讨论】:
以上是关于类型错误:state.getIn 不是函数的主要内容,如果未能解决你的问题,请参考以下文章
错误类型错误:_co.deleteConsulta 不是函数