[英]Aplication works but generates an error: mapDispatchToProps() in Connect(App) must return a plain object. Instead received undefined
[英]React-Redux container throws “mapStateToProps() in Connect(ModalRoot) must return a plain object. Instead received undefined.”
我正在基于Dan Abramov的以下问题的解决方案构建基于Redux的模型/对话框触发器: Dan Abramov的解决方案
我收到的错误是“ Connect(ModalRoot)中的mapStateToProps()必须返回普通对象。相反,接收到的是未定义的对象。”
// The Modal Container
import LoginModal from '../components/Modals/LoginModal'
import {connect} from 'react-redux'
const MODAL_COMPONENTS = {
'LOGIN_MODAL': LoginModal
/* other modals */
}
const ModalRoot = ({ modalType, modalProps }) => {
if (!modalType) {
return <span /> // after React v15 you can return null here
}
const SpecificModal = MODAL_COMPONENTS[modalType]
return <SpecificModal {...modalProps} />
}
export default connect(
state => state.modal
)(ModalRoot)
// The Modal Container import LoginModal from '../components/Modals/LoginModal' import {connect} from 'react-redux' const MODAL_COMPONENTS = { 'LOGIN_MODAL': LoginModal /* other modals */ } const ModalRoot = ({ modalType, modalProps }) => { if (!modalType) { return <span /> // after React v15 you can return null here } const SpecificModal = MODAL_COMPONENTS[modalType] return <SpecificModal {...modalProps} /> } export default connect( state => state.modal )(ModalRoot)
也许mapStateToProps需要从化简器中选择一个特定的对象
你可以尝试这样的事情吗?
function mapStateToProps(state){
const {modalType,modalProps} = state.modal;
return {modalType,modalProps};
}
这或者您可能没有正确地将CombineReducers传递到您的商店
问题的根本原因是state.modal
未定义。 您可以通过添加以下简单的日志语句来获取更多信息:
export default connect(state => { console.log('state', state); return state.modal })(ModalRoot)
这可以帮助您查看state
并帮助弄清为什么未定义state.modal
。
要使此错误消失,可以使用以下两种解决方案之一:
确保对象不是未定义的:
export default connect(state => state.modal || {})(ModalRoot)
使用ES6解构:
export default connect(({ modal }) => ({ modal }))(ModalRoot)
如果您使用ES6解构(与@MichaelRasoahaingo的解决方案基本相同),则您的道具解构也将更改为:
const ModalRoot = ({ modal: { modalType, modalProps } }) => {
或者,您可以使用这种替代语法,并按原样保留解构:
export default connect(({ modal }) => ({ ...modal }))(ModalRoot)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.