combineReducers()在React Redux中不工作

oknrviil  于 2023-11-19  发布在  React
关注(0)|答案(3)|浏览(147)

这是我的商店代码

  1. import { combineReducers, createStore } from "redux";
  2. import counterReducer from "./../Counter/counter.reducer";
  3. const rootReducer = combineReducers({ first: counterReducer });
  4. const store = createStore(rootReducer);
  5. export default store;

字符串
和组件:

  1. const Sid = () => {
  2. const num = useSelector((state) => state.counter);
  3. const dispatch = useDispatch();
  4. return (
  5. <div>
  6. <h1>Count value is {num}</h1>
  7. <button onClick={() => dispatch(increaseCounter())}>Add 5 </button>
  8. <button onClick={() => dispatch(decreaseCounter())}>Subtract 50</button>
  9. </div>
  10. );
  11. };

输出:


的数据
代码工作正常,如果我不使用合并减速器,直接使用单一的减速器在createStore() function
请帮我解决这个问题。提前感谢您的帮助。

brqmpdu1

brqmpdu11#

当你使用combineRreducers时,你的store对象将与你传入的对象具有相同的键,并将reducer返回值作为值。
所以在你的例子中,商店应该是这样的

  1. {
  2. first: {
  3. counter: 0
  4. }
  5. }

字符串
问题是你试图在选择器中从state.counter而不是state.first.counter中读取值
只需将选择器更改为

  1. const num = useSelector(state => state.first.counter);

展开查看全部
hmtdttj4

hmtdttj42#

一条建议:写每一行代码都要有目的。
根据official documentationcombineReducers用于下面提到的场景。
随着你的应用变得越来越复杂,你会希望将reducing函数拆分为单独的函数,每个函数管理状态的独立部分。
你只有一个减速器,那么就不需要合并减速器了。只要简单地按下面的方法传递你的减速器就可以了。

  1. import { createStore } from "redux";
  2. import counterReducer from "./../Counter/counter.reducer";
  3. const store = createStore(counterReducer); // Just pass `counterReducer` directly
  4. export default store;

字符串
让我知道如果你需要进一步的支持。

s2j5cfk0

s2j5cfk03#

下面是对这个问题的一个稍微精炼的回答:

**方法一:**如果是connect方法,将stateMap到props,将propsMap到dispatch,则需要在访问state值时添加key名称。
方法二:如果您也使用useHook,则同样适用。

代码如下:
问题所示的例子所需的更改是

  1. const num = useSelector((state) => state.first.counter);

字符串
如果您使用方法1,则需要进行以下更改

  1. const mapStateToProps = (state) => {
  2. return {
  3. counter: state.first.numOfCakes,
  4. };
  5. }

展开查看全部

相关问题