当前位置: 首页 > 知识库问答 >
问题:

React-Redux容器抛出Connect(ModalRoot)中的mapStateToProps()必须返回一个普通对象。而是收到未定义。"

魏宏邈
2023-03-14

我正在基于Dan Abramov对这个问题的解决方案构建一个基于Redux的模型/对话框触发器:Dan Abramov的解决方案

我得到的错误是“Connect(ModalRoot)中的MapStateTops()必须返回一个普通对象,而不是未定义的接收。”

// Code that calls the Modal Container

import React from 'react';
import { Provider } from 'react-redux';
import { Connector as HorizonConnector } from 'horizon-react';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';

import routes from '../routes';
import store from '../store';
import horizon from '../db';
import ModalRoot from './Modal';

export default () => (
  <MuiThemeProvider muiTheme={getMuiTheme()}>
    <HorizonConnector horizon={horizon} store={store}>
      <div className="app">
        {routes}
        <ModalRoot />
      </div>
    </HorizonConnector>
  </MuiThemeProvider>
);
 // 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)

共有3个答案

姚嘉容
2023-03-14

问题的根本原因是state.modal未定义。您可以通过添加一个简单的日志语句来获取更多信息,例如:

export default connect(state => { console.log('state', state); return state.modal })(ModalRoot)

这可能有助于您查看什么处于状态,并有助于找出为什么state.modal未定义。

要消除此错误,可以使用以下两种解决方案之一:

确保对象不是未定义的:

export default connect(state => state.modal || {})(ModalRoot)

使用ES6解构:

export default connect(({ modal }) => ({ modal }))(ModalRoot)

如果您使用ES6解构(本质上与@MichaelRasahaingo的解决方案相同),您的道具解构也将更改为:

const ModalRoot = ({ modal: { modalType, modalProps } }) => {

或者,您也可以使用此替代语法,并保持解构的原样:

export default connect(({ modal }) => ({ ...modal }))(ModalRoot)
奚卓
2023-03-14

也许mapStateToProps需要从减速器中选择一个特定的对象

你能试试这样的东西吗?

function mapStateToProps(state){
  const {modalType,modalProps} = state.modal;
  return {modalType,modalProps};
}

要么是这样,要么是您没有正确地将组合减速器传递到您的商店

明越
2023-03-14

根据redux实现和示例,您应该这样写

export default connect(
  state => ({
    modal: state.modal
  })
)(ModalRoot)

看这里

 类似资料:
  • 问题内容: 我正在尝试为通过map函数创建的自定义组件创建动态引用。 在返回正确的DOM节点,但在循环的那些,它返回一个对象。 有人可以指出我正确的方向吗? 问题答案: 似乎是一个连接的组件,而您实际上需要包装的组件。 与连接 然后通常添加一个引用: 从文档: 如果已传递给,则向连接的包装器组件添加一个ref实际上将返回被包装组件的实例。 与连接 然后用于获取基础的连接组件: 从文档: [with

  • 问题内容: 未处理的拒绝(错误):动作必须是普通对象。使用自定义中间件进行异步操作。 我想在每个帖子中添加评论。因此,当获取帖子运行时,我想为所有帖子调用获取评论API。 问题答案: 您必须在异步请求结束后分派。 这将工作:

  • 问题内容: 我有一个元素定义为 我想读取此元素中的文本,即“ ABC”,但这样做是:var client = page.clientRowName.getText(); 返回一个对象而不是一个字符串。还有什么其他方法可以获取元素的文本 问题答案: 返回一个promise,您需要 解决 它: 或者,如果您只想声明文本,请为您解决承诺: 承诺和“控制流”文档页面应清除所有内容。

  • 问题内容: 我正在尝试了解react-redux的connect方法及其作为参数的功能。特别是。 以我的理解,它的返回值将是一个从状态派生的对象(因为它存在于商店中),其键将作为道具传递给目标组件(应用了connect的组件)。 这意味着目标组件所消耗的状态与存储在商店中的状态可能具有截然不同的结构。 问:可以吗? 问:这是预期的吗? 问:这是反模式吗? 问题答案: 问: 答:是的 问: 是的,这

  • 条款23: 必须返回一个对象时不要试图返回一个引用 据说爱因斯坦曾提出过这样的建议:尽可能地让事情简单,但不要过于简单。在c++语言中相似的说法应该是:尽可能地使程序高效,但不要过于高效。 一旦程序员抓住了“传值”在效率上的把柄(参见条款22),他们会变得十分极端,恨不得挖出每一个隐藏在程序中的传值操作。岂不知,在他们不懈地追求纯粹的“传引用”的过程中,他们会不可避免地犯另一个严重的错误:传递一个

  • 我得到一个空白的浏览器和在控制台我得到这个错误 未捕获的TypeError:超级表达式必须为null或函数,而不是未定义的 我读过其他类似的帖子,但没有看到任何相关的内容。 这是我的文件: 这是我的文件: 这是文件: 您已经注意到,我正在运行一些旧版本的webpack和其他软件包,因为我正试图跟上webpack的速度,但我不确定这是否是问题所在。我不确定它指的是什么。 有人问我关于扩展的问题,我正