【问题标题】:Why my redux state always return with default case?为什么我的 redux 状态总是以默认情况返回?
【发布时间】:2021-08-17 19:57:47
【问题描述】:

我正在使用 react-redux 但我看不到我的状态。当我检查我的状态时,它总是返回我的默认值。我检查我的类型,但它返回真值。问题出在哪里 ?感谢您的帮助

我的行动:

import { 
  SET_MENULIST
} from "../constants/Menu";

export const makeMenu = (menuList) => {
  return {
    type: SET_MENULIST,
    menuList,
  };
};

我的减速机:

const menu = (state = {}, action) => { 

  switch (action.type) {
    case SET_MENULIST:
      return {
        menuList: action.menuList,
      };
 
    default:
      return "err";
  }
};
export default menu;

我的 reducer/index.js(combineReducers):

import { combineReducers } from "redux";
import Auth from "./Auth";
import Theme from "./Theme";
import Menu from "./Menu";
const reducers = combineReducers({
  theme: Theme,
  auth: Auth,
  menu: Menu,
});

export default reducers;

我尝试在我的页面上像 makeMenu(data); 一样使用它并像这样测试它:

const test = useSelector((state) => state.menu);
 console.log(test) //Its returns "err" (Default value of my reducer

)

错在哪里?谢谢回复!!!

【问题讨论】:

  • 您是如何调度makeMenu(data) 操作的?
  • @slideshowp2 我想我没有发送它。也许这就是它不工作的原因。我只是从动作中导入它然后尝试使用它。
  • 你能提供一个最小的、可重现的、完整的代码示例吗?
  • SET_MENULIST的类型是什么?
  • 我从常量导入我的 SET_MENULIST。始终如一:export const SET_MENULIST = "SET_MENULIST";

标签: reactjs redux react-redux


【解决方案1】:

你快到了。有几件事要改变:

调度动作

从调用makeMenu 函数的位置,您必须调度操作。 示例:

import {useDispatch} from 'react-redux'
import {makeMenu} from './path/to/makeMenu'

const ComponentExample = props => {
  const dispatch = useDispatch()
  
  dispatch(makeMenu(menuList)) /* call this wherever you want to call makeMenu */

}

奖励:从减速器返回

当你像这样从reducer返回一个新对象时,你会覆盖其他值,所以一个潜在的错误。

case SET_MENULIST:
      return {
        menuList: action.menuList,
      };

您可能想要使用扩展运算符:

case SET_MENULIST:
      return {
        ...state,
        menuList: action.menuList,
      };

【讨论】:

  • 非常感谢。它的工作!但我可以问额外的问题吗?有些人在没有 useDispatch 的情况下发送它。在我的示例项目中,他们只使用函数名称,例如:makeMenu(data) 及其工作。怎么可能?我的意思是没有 useDispatch?
  • 你可以用中间件包装你的 redux。查看 redux-thunk。当您使用 mapStateToPropsmapDispatchToProps 时,您可以这样做。但是,如果您想知道我的个人意见,我会选择像 useDispatch 这样的钩子。
  • 非常感谢。你帮了我很多!我会按照你说的那样使用 useDispatch 但我问它是因为我想知道 :) 再次感谢你,祝你有美好的一天!
  • 没问题,编码愉快!
猜你喜欢
  • 1970-01-01
  • 2011-07-27
  • 2021-10-23
  • 1970-01-01
  • 2021-09-16
  • 2016-10-27
  • 2023-01-03
  • 2021-04-19
  • 2022-12-07
相关资源
最近更新 更多