未定义的 mapStateToProps React Redux

Posted

技术标签:

【中文标题】未定义的 mapStateToProps React Redux【英文标题】:Undefined mapStateToProps React Redux 【发布时间】:2019-01-15 19:19:48 【问题描述】:

嘿,我的 badgeNumber 经常以未定义的形式返回,我真的不明白为什么。感谢您的帮助。

我的减速机:

import OPEN_DROPDOWN, ADD_TASK, REMOVE_TASK, CLOSE_DROPDOWN from '../types/MenuTypes';

const initialState = 
  badgeNumber: 6,
  drop: false,
  tasks: [] 
;

export function reducerMenuEntry(startMenuState = initialState, action) 
  switch (action.type) 
    case OPEN_DROPDOWN:
      return Object.assign(, startMenuState, 
        ...startMenuState,
        drop: true
      );

    case CLOSE_DROPDOWN:
      return Object.assign(, startMenuState, 
        ...startMenuState,
        drop: false
      );

    case REMOVE_TASK:
    case ADD_TASK:
      return Object.assign(, startMenuState, 
        ...startMenuState,
        badgeNumber: action.badgeNumber,
        tasks: action.tasks
      );

    default:
      return initialState;
  

以及我尝试显示数据的组件:

import  connect  from 'react-redux';

class ToolsBar extends Component 
  render() 
    const badgeNumber = this.props;
    alert(badgeNumber);
    return (
      <Toolbar ...this.props.getActionsProps()>
        <ToolbarButton>
          <Badge badgeContent=badgeNumber />
        </ToolbarButton>
      </Toolbar>
    );
  ;
;

const mapStateToProps = state => 
  return 
    drop: state.drop,
    badgeNumber: state.badgeNumber
  ;
;

export default connect(mapStateToProps)(ToolsBar);

商店:

import  createStore, applyMiddleware  from 'redux';
import RootReducer from './reducers/RootReducer';
import thunk from 'redux-thunk';

export default () => 
  return createStore(RootReducer, applyMiddleware(thunk));
;

操作,但目前尚未完全实施。我想在通过操作修改它们之前显示静态值:

import  OPEN_DROPDOWN, ADD_TASK, REMOVE_TASK, CLOSE_DROPDOWN from "../types/MenuTypes";

export const open = () => 
  return  type: OPEN_DROPDOWN 
;

export const close = () => 
  return  type: CLOSE_DROPDOWN 
;

export function addTask(tasks, badgeNum)
  badgeNum++;
  return  type:ADD_TASK, tasks, badgeNum
;

export function removeTask (tasks, badgeNum)
  badgeNum--;
  return  type: REMOVE_TASK, tasks, badgeNum
;

组合减速机:

import combineReducers from 'redux';
import reducerUpdatePageEntry from './UpdatePageReducer';
import reducerSearchPageEntry from './SearchPageReducer';
import reducerSharedEntry from './SharedReducer';
import reducerUploadPageEntry from './UploadPageReducer';
import reducerMenuEntry from './MenuReducer';

export default combineReducers(
  updateStates: reducerUpdatePageEntry,
  displaySearchStates: reducerSearchPageEntry,
  sharedStates: reducerSharedEntry,
  uploadStates: reducerUploadPageEntry,
  menuStates: reducerMenuEntry
);

【问题讨论】:

该道具是通过异步操作从某个地方传来的吗? 对不起我对Redux不好我以为他们是通过商店传递的 好的,但是这个badgeNumber 值是从哪里来的?它在您的代码中是静态的还是来自 API?最好添加您的动作创建者代码。你有 thunk 中间件,所以可能有一个异步作业。 目前是静态的,我将更新评论,以便我也可以显示操作。 另外,请您的减速机。因为我们现在看不到你的state 是什么样子的。 【参考方案1】:

当您组合 reducer 时,您会在应用程序上创建多个状态。

您的 mapStateToProps 函数应如下所示:

const mapStateToProps = state => 
  return 
    drop: state.menuStates.drop,
    badgeNumber: state.menuStates.badgeNumber
  ;
;

还有一点:如果你已经在使用 object spread,你就不需要 Object.assign

像这样使用它:

return 
    ...startMenuState,
    drop: false
  );

【讨论】:

【参考方案2】:

您在 mapStateToProps 中指定了错误的路径:

const mapStateToProps = state => 
  return 
    drop: state.menuStates.drop,
    badgeNumber: state.menuStates.badgeNumber
  ;
;

另外要小心

default:
  return initialState;

应该是这样的

default:
  return startMenuState;

因为如果您返回 initialState,则状态将随着每个未处理的操作而重置。

【讨论】:

以上是关于未定义的 mapStateToProps React Redux的主要内容,如果未能解决你的问题,请参考以下文章

React-Redux mapStateToProps 值在被reducer设置后未定义

mapStateToProps 将数据传递给道具

如何为调用 reduxjs 的 mapStateToProps 的反应组件编写单元测试?

mapStateToProps,但未调用componentDidUpdate

调度操作时未调用redux connect mapStateToProps

REACT + REDUX:在 redux 状态更改时 mapStateToProps 更新状态,但视图未按照新状态呈现