首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redux -未调用Reducer

Redux 是一个用于 JavaScript 应用的状态管理库,它通常与 React 一起使用,但也可以与其他框架或库结合使用。Redux 的核心概念包括 store、actions、reducers 和 selectors。

基础概念

  1. Store: 存储应用的所有状态的对象。
  2. Actions: 描述发生了什么的普通 JavaScript 对象。
  3. Reducers: 纯函数,接收当前状态和一个 action,并返回新的状态。
  4. Selectors: 用于从 store 中提取特定数据的函数。

未调用Reducer的原因

如果 Redux 中的 reducer 没有被调用,可能是以下几个原因:

  1. Action 没有被正确分发:确保你已经使用 dispatch 方法分发了 action。
  2. Reducer 没有被正确注册:确保你的 reducer 已经被添加到 root reducer 中,并且这个 root reducer 被传递给了 createStore
  3. Action 类型不匹配:确保 action 的 type 字段与 reducer 中处理的类型相匹配。
  4. Middleware 干扰:如果你使用了 middleware,如 Redux Thunk 或 Redux Saga,它们可能会影响 action 的分发。

解决方法

  1. 检查 Action 分发
  2. 检查 Action 分发
  3. 确认 Reducer 注册
  4. 确认 Reducer 注册
  5. 核对 Action 类型
  6. 核对 Action 类型
  7. 调试 Middleware: 如果你使用了 middleware,确保它们没有阻止 action 到达 reducer。可以通过 logging 或使用 Redux DevTools 来调试。

示例代码

假设我们有一个简单的计数器应用,我们想要增加计数器的值。

Action:

代码语言:txt
复制
const INCREMENT = 'INCREMENT';

export const increment = () => ({
  type: INCREMENT,
});

Reducer:

代码语言:txt
复制
const initialState = { count: 0 };

function counterReducer(state = initialState, action) {
  switch (action.type) {
    case INCREMENT:
      return { ...state, count: state.count + 1 };
    default:
      return state;
  }
}

Store:

代码语言:txt
复制
import { createStore } from 'redux';
import { counterReducer } from './reducers';

const store = createStore(counterReducer);

组件中使用:

代码语言:txt
复制
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment } from './actions';

function Counter() {
  const count = useSelector(state => state.count);
  const dispatch = useDispatch();

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => dispatch(increment())}>Increment</button>
    </div>
  );
}

通过以上步骤,你可以确保 action 被正确分发,reducer 被正确调用,并且状态得到更新。

应用场景

Redux 适用于大型应用,特别是当应用的状态管理变得复杂时。它可以帮助开发者跟踪状态的变化,使得状态管理更加可预测和可调试。

优势

  • 单一数据源:整个应用的状态存储在一个对象树中。
  • 状态可预测:通过纯函数(reducers)来更新状态。
  • 开发者工具:Redux DevTools 提供了时间旅行调试的能力。
  • 社区和生态系统:丰富的中间件和库支持。

通过这些信息,你应该能够理解 Redux 中 reducer 未被调用的原因,并知道如何解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redux(二):组织reducer

六、组合reducer 接着我们需要再优化一下根reducer,也就是appReducer。...appReducer = combineReducers(initialState,{ visibilityFilter:visibilityReducer, todos:todosReducer }); 从redux...combineReducers(initialState,{ visibilityFilter:visibilityReducer, todos:todosReducer })); 至此,大功告成~ Redux...Reducer本质上就是纯函数,每一次派发action都会导致Reducer的执行,而Reducer的内部通过条件语句下发到子reducer,最终计算出新的state状态树并更新store。...接着依次执行通过subscribe注册的回调函数,那么这个回调函数就是关键了,如果都是同步函数,那放到一个数组中遍历依次执行即可,但如果是异步函数那就要用到接下来要讲的中间件了,可以说正是中间件系统极大的拓展了redux

51630

Redux框架reducer对状态的处理

前言 在react+redux项目里,关于reducer处理state的方式,在redux官方文档中有这样一段描述: 不要修改 state。 使用 Object.assign() 创建了一个副本。...为什么要创建副本state 在redux-devtools中,我们可以查看到redux下所有通过reducer更新state的记录,每一条记录都对应着内存中某一个具体的state,使得用户可以追溯到每一次历史操作产生与执行的状态...则可选的方案包括: 方案1 将todoApp这个reducer拆分为更细化的reducer,以保证visibilityFilter属性中嵌套对象b的属性d能得到正确更新。...方案2 采用官方实例中Object.assign方法,但需要将visibilityFilter中未更新的对象用原state中的对象进行手动赋值: function todoApp(state = initialState...,很多reducer其实没有必要进行如此深层次的细化拆分。

2.2K50
  • Redux系列01:从一个简单例子了解action、store、reducer

    本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 先看例子 其实,redux的核心概念就是store、action、reducer,从调用关系来看如下所示 store.dispatch...用来修改state // 参数2(可选): [], 默认的state值,如果不传, 则为undefined var store = redux.createStore(reducer, []); /...redux.createStore(reducer, []); // 通过 store.getState() 可以获取当前store的状态(state) // 默认的值是 createStore 传入的第二个参数...其中,state为当前的状态(可通过store.getState()获得),而action为当前触发的行为(通过store.dispatch(action)调用触发)。...中文文档:http://camsong.github.io/redux-in-chinese/index.html redux英文文档:http://redux.js.org/index.html redux

    61510

    Redux系列01:从一个简单例子了解action、store、reducer

    本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 先看例子 其实,redux的核心概念就是store、action、reducer,从调用关系来看如下所示 store.dispatch...用来修改state // 参数2(可选): [], 默认的state值,如果不传, 则为undefined var store = redux.createStore(reducer, []); /...redux.createStore(reducer, []); // 通过 store.getState() 可以获取当前store的状态(state) // 默认的值是 createStore 传入的第二个参数...其中,state为当前的状态(可通过store.getState()获得),而action为当前触发的行为(通过store.dispatch(action)调用触发)。...中文文档:http://camsong.github.io/redux-in-chinese/index.html redux英文文档:http://redux.js.org/index.html

    69870

    为什么 Vuex 的 mutation 和 Redux 的 reducer 中不能做异步操作?

    然而,在上面的例子中 mutation 中的异步函数中的回调让这不可能完成:因为当 mutation 触发的时候,回调函数还没有被调用,devtools 不知道什么时候回调函数实际上被调用——实质上任何在回调函数中进行的状态的改变都是不可追踪的...Redux 先从Redux的设计层面来解释为什么Reducer必须是纯函数 如果你经常用React+Redux开发,那么就应该了解Redux的设计初衷。...Redux的设计参考了Flux的模式,作者希望以此来实现时间旅行,保存应用的历史状态,实现应用状态的可预测。...所以整个Redux都是函数式编程的范式,要求reducer是纯函数也是自然而然的事情,使用纯函数才能保证相同的输入得到相同的输入,保证状态的可预测。...所以Redux有三大原则: 单一数据源,也就是state state 是只读,Redux并没有暴露出直接修改state的接口,必须通过action来触发修改 使用纯函数来修改state,reducer

    2.8K30

    Redux介绍及源码解析

    , 当调用createStore时会触发一次 REPLACE: `@@redux/REPLACE${randomString()}`, // 替换, 当使用者动态更新reducer的时候会调用一次...如上面 disptach 流程所示, subscribe 将在任何一个 action 被执行完后调用, 虽然 Redux 没有传递任何参数给到 subscribe 的 listener, 但是在监听器中可以调用...isSubscribed = false // 恢复未订阅状态 ensureCanMutateNextListeners() // 拷贝当前订阅列表 const index = nextListeners.indexOf...当然, 现在官方已经开始推荐使用 redux-toolkit, 他是基于 Redux 的最佳实践, 简化了 Redux 的编写调用, 他采用了函数式、柯里化等编程思维, 具体差异可以参考官方说明....组件可以有多个Store有唯一的DispatcherState是可变的, 未做保护在Store中执行状态更新不支持异步操作Redux单向数据流函数式编程Flux架构的具体实现无技术栈限制只有一个Store

    2.5K20

    React中的Redux

    现在我们可以开发一个函数来做为主 reducer,它调用多个子 reducer 分别处理 state 中的一部分数据,然后再把这些数据合成一个大的单一对象。...Redux store 调用传入的 reducer 函数。 Store 会把两个参数传入 reducer: 当前的 state 树和 action。...state 数据修改 从props中调用回调函数 向Redux派发actions 调用方式 手动 通常由React Redux生成 大部分的组件都应该是展示型的,但一般需要少数的几个容器组件把它们和...合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。...每个传入 combineReducers 的 reducer 都需满足以下规则: 所有未匹配到的 action,必须把它接收到的第一个参数也就是那个 state 原封不动返回。

    4K20

    Redux框架之combineReducers() 用法讲解

    combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用...合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。...返回值 (Function):一个调用 reducers 对象里所有 reducer 的 reducer,并且构造一个与 reducers 对象结构相同的 state 对象。...每个传入 combineReducers 的 reducer 都需满足以下规则: 所有未匹配到的 action,必须把它接收到的第一个参数也就是那个 state 原封不动返回。...在 reducer 层级的任何一级都可以调用 combineReducers。并不是一定要在最外层。实际上,你可以把一些复杂的子 reducer 拆分成单独的孙子级 reducer,甚至更多层。

    56320

    React Native+React Navigation+Redux开发实用教程

    每个传入 combineReducers 的 reducer 都需满足以下规则: 所有未匹配到的 action,必须把它接收到的第一个参数也就是那个 state 原封不动返回。...返回值 (Function):一个调用 reducers 对象里所有 reducer 的 reducer,并且构造一个与 reducers 对象结构相同的 state 对象。...combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用...合并后的 reducer 可以调用各个子 reducer,并把它们返回的结果合并成一个 state 对象。...提示:在 reducer 层级的任何一级都可以调用 combineReducers。并不是一定要在最外层。

    4K10

    React进阶(2)-上手实践Redux-如何获取store的数据

    image.png 前言 在前面的一文理解Redux中,已经知道了Redux的工作流程以及Redux的设计基本原则,它就是一个用于管理组件的公共数据状态的数据层框架,包括了Store,Reducer...引入createStore后,store并没有创建,需要调用createStore()后才有store const store = createStore(reducer); // 创建好reducer...在项目中引入redux库,同时创建一个store仓库,这是通过调用createStore函数实现的 import { createStore } from 'redux'; const store =...工作流中的右边的内容 整个过程总结几句话就是: 引入redux库,并调用createStore函数,从而创建了store,紧接着创建reducer函数,用于管理组件公共的状态数据,返回组件的最新的状态数据给...结语 本文并不是什么高大上的内容,主要是对学习Redux的一个小小的初探 用几句简单归纳下:组件如何获取store中的数据 安装redux,然后从redux中引入createStore这个方法,并调用它

    2.3K20
    领券