我正在我的react项目上实现不可变,将其与redux一起使用,使用fromJS((函数(来自不可变库(使state成为不可变对象。在我的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);
控制台日志(状态(结果
控制台日志(状态(的结果
PS:当我不使用不可变状态时,一切都很好。
看起来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']),
});
};
使用来自griddle-react
而非react-redux
的连接。