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

Redux:为什么要调用reducers两次(初学者)

Redux是一个用于JavaScript应用程序的状态管理库。它通过一个单一的全局状态树来管理应用程序的状态,并使用纯函数来处理状态的变化。Reducers是Redux中的一个重要概念,它是纯函数,用于描述如何根据先前的状态和一个action来计算新的状态。

为什么要调用reducers两次是一个初学者常见的疑问。这是因为在Redux中,当一个action被分发到store时,reducers会被调用两次。第一次调用是为了初始化应用程序的状态,第二次调用是为了根据action更新状态。

第一次调用reducers时,传递给reducers的先前状态为undefined,这是因为Redux要求reducers在初始化时返回一个有效的状态。因此,reducers应该在第一次调用时返回一个初始状态。

第二次调用reducers时,传递给reducers的先前状态是第一次调用时返回的初始状态。reducers根据action的类型来判断应该如何更新状态,并返回一个新的状态。这个新的状态将成为应用程序的当前状态,并被存储在Redux的全局状态树中。

调用reducers两次的目的是为了确保reducers是纯函数,它的输出只取决于输入。通过这种方式,Redux可以保证应用程序的状态是可预测的和可控制的。

在使用Redux时,可以使用combineReducers函数将多个reducers组合成一个根reducer。这样做的好处是可以将应用程序的状态分割成多个独立的部分,每个部分由一个独立的reducer管理。这样可以提高代码的可维护性和可扩展性。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种规模的业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

阅读redux源码

为什么需要使用redux 提供了和双向绑定思想不同的单向数据流,应用状态可以预测,可以回溯,易于调试。...The initial state may not be undefined.` ) } }) } 这块其实就两个判断,reducer被执行了两次,一个是判断没有初始化state...reducer会被执行多次,这也是我们为什么保证reducer的纯粹性,不能做任何其他的操作的原因 继续往下看 combineReducers 可以看到返回了一个函数 combination(state...为什么返回函数呢? 那我们看 combination(state = {}, action) 像什么?不就是我们经常写的reducer嘛!...createStore 一般这个方法我们可以直接从demo中复制过来,不需要太过了解,但是既然深入了解redux,必然掌握这个方法 跟之前一样,先找到 export createStore 方法,

80910
  • 同一份数据,Redis为什么两次

    集合对象常用命令 五种基本类型之有序集合对象 有序集合对象常用命令 总结 ---- 前言 在 Redis 中,有一种数据类型,当在存储的时候会同时采用两种数据结构来进行分别存储,那么 Redis 为什么这么做呢...3.现在新的数组内放置 4 个元素,原来的数组排在第 3,所以需要将升级后的 3 移动到 64-95 位。 4.继续将升级后的 2 移动到 32-63 位。...也就是说字典和跳跃表中的数据都指向了我们存储的元素(两种数据结构最终指向的是同一个地址,所以数据并不会出现冗余存储),Redis 为什么这么做呢?...为什么同时选择使用字典和跳跃表 有序集合直接使用跳跃表或者单独使用字典完全可以独自实现,但是我们想一下,如果单独使用跳跃表来实现,那么虽然可以使用跨度大的指针去遍历元素来找到我们需要的数据,但是其复杂度仍然达到了...O(logN),而字典中获取一个元素的复杂度是 O(1),而如果单独使用字典虽然获取元素很快,但是字典是无序的,所以如果范围查找就需要对其进行排序,这又是一个耗时的操作,所以 Redis 综合了两种数据结构来最大程度的提升性能

    33730

    【干货】从零实现 react-redux

    原本我们用 jQuery 开发应用,除了实现业务逻辑,还要操作 DOM 来手动实现页面的更新。尤其是涉及到渲染列表的时候,更新起来非常麻烦。...前面讲了很多例子,可状态管理到底管理什么呢?在我看来,状态管理的一般就是这两种数据。...无论被调用多少次,只要传入相同的 state 和 action,那么就一定返回同样的结果。...之所以通过 getState 来获取 store 是为了获取到当前 store 的快照,这样便于打印日志以对比前后两次 store 变化,方便调试。...关于 Redux 中 store 如何设计对初学者来说一直都是难题,在我看来这不仅是 Redux 的问题,在任何前端 store 设计中应该都是一样的。

    1.7K10

    【React】717- 从零实现 React-Redux

    原本我们用 jQuery 开发应用,除了实现业务逻辑,还要操作 DOM 来手动实现页面的更新。尤其是涉及到渲染列表的时候,更新起来非常麻烦。...前面讲了很多例子,可状态管理到底管理什么呢?在我看来,状态管理的一般就是这两种数据。...无论被调用多少次,只要传入相同的 state 和 action,那么就一定返回同样的结果。...之所以通过 getState 来获取 store 是为了获取到当前 store 的快照,这样便于打印日志以对比前后两次 store 变化,方便调试。...关于 Redux 中 store 如何设计对初学者来说一直都是难题,在我看来这不仅是 Redux 的问题,在任何前端 store 设计中应该都是一样的。

    1.2K10

    『Dva』管理数据

    model 中通过 namespace 来指定这个 model 的命名空间是 home:/* index.js */+ let homeModel = {+ namespace: 'home'+ }为什么指定命名空间呢...} }reducers 定义好了,那么 reducers 中是不是定义一些处理方法,比如说我在这里定义一个叫做 add 的处理方法,这个方法对应一个函数,这个函数接收两个参数,第一个参数是 state...接下来我又要说到 dva 的本质了,dva 的本质是对 reduxredux-saga 进行封装,那既然是对 redux 进行封装,这个时候在 saga 中想要使用保存在 homeModel 中的数据...、redux-saga 进行封装,所以说 connect 是从 redux 中导入的,这里可以直接从 dva 中导入 connect:/* index.js */+ import {connect} from...Home 组件关联起来:/* index.js */+ st AdvHome = connect(mapStateToProps, mapDispatchToProps)(Home);connect 需要调用两次

    24831

    【React】211- 2019 React Redux 完全指南

    想要理解 Redux 完整的工作机制真的让人头疼。特别是作为初学者。 术语太多了!...你可以简写成 mapState 或者用任何你想的方式调用。只要你接收 state 对象然后返回全是 props 的对象,那就没问题。 为什么不传整个 state?...但通常是对象)然后传给你包装组件的 connect 函数,你将收到这些 action 生成器作为可调用 props。...如何使用 Redux Thunk 获取数据 既然 reducers 应该是“纯”的,我们不能做在 reducer 里面做任何 API 调用或者 dispatch actions。...然后我们在它前后分别做了一些 dispatch 调用。 Dispatch Action 来获取数据 开始调用并且实际获取数据,我们需要 dispatch fetchProducts action。

    4.2K20

    为什么java初学者学习一点前端技术?

    所以,初学者,除非是极为感兴趣,不然,都很不情愿的学习前端知识! 其实,现在大部分公司,都是采用前后端分离的架构!...但是我为什么依旧是建议JAVA自学者,和在校大学生去好好学习前端知识呢?理由有三: 一、基于知识的理解:也是最重要的一点!在校生和自学者,一般对于项目的练习,很少会有分工合作,都是各自为王!...二、技术不能落地:如果只会后端,面对无聊且枯燥的代码,对初学者的劝退率太高了!你写的代码,你会发现,你无法应用到实处!你就只知道JSON就是将一个对象转换成一定格式的字符串,却不知道他到底能干嘛!...为什么转换成字符串!业内有一句话!脱离业务谈技术,都是耍流氓!而和真正和用户交互的不是程序,而是界面!你不可能要求一个普通用户,也去学会代码! 三、加分项!...:其实,初学者和在校生,一般都不会有太复杂的项目经验!最多就是跟着导师做一些项目!或者自己YY一些项目!会一点前端技术,其实也是面试中的加分项!

    95520

    1228-redux学习笔记(摘录) | WEB前端零基础课

    不使用redux时,组件的层级,其实是react数据的传递的通道。 多写,否则没用。 <!...它里面的状态,State, 调用 getState()方法获取, import {createStore} from 'redux'; //引入redux const store = createStore...-- --> Reducers [rɪ'dju:sə] Reducers,它是一个“处理action要做的事情的地方”, Reducers 收到state之后,返回一个新的 state, 这个过程,...-- store.dispatch(action) --> 2、store自动调用 reducers,并传入二个参数, -当前state -收到的action, 它会返回新的state 3、state...一但发生变化,就自动 调用 store.subscribe(listen); 4、listen通过 getState()得到更新之后的state, 调用render,重新渲染页面。

    1K100

    Rematch: Redux 的重新设计

    Redux 的受欢迎程度是否值得我们去使用? 为什么或者为什么不值得? 我们能否制定更好状态管理解决方案吗?如果能,怎么做?...也许最流行的状态管理库是Redux。在过去的两年里,它变得越来越受欢迎。那么为什么这么喜欢一个简单的库呢? Redux 更具性能?答案是否定的。...为什么使用 Redux 在表层之下,Redux 与 TJ 的根对象{}完全相同——只是包装在了一系列实用工具的管道(pipeline)中。 在 Redux 中,不能直接修改状态。...简化 reducers Redux 中的 reducers 可以通过一个转换,让我们远离已经习惯但不必要且冗长的 switch 语句。...如果是,中间件调用该函数,并传入一些 store 的方法:dispatch 和 getState。 怎么会这样?

    1.6K50

    Redux进阶(像VUEX一样使用Redux) 前言redux的问题方案目标如何实现思考

    另外一个则是处理副作用的话,那就必须使用到了中间件,所以最后我们暴露出来的函数的返回值应该具有上面两个属性,如下: import reduxSimp from '.....同时加上命名空间作为前缀,将副作用的key即type 和相对应的方法value分开存放在两个数组里面,然后定义一个中间件,每当有一个dispatch的时候,检查key数组中是否有符合的key,如果有,则调用对应的...} store */ const effectMiddler = store => next => (action) => { next(action) // 如果存在对应的effect, 调用其方法...} store */ const effectMiddler = store => next => (action) => { next(action) // 如果存在对应的effect, 调用其方法...} // 初始化一个reducers 最后传给combinReducer的值 也是最终还原的redux const reducers = {} // 遍历传入的model const modelArr

    1.2K30

    redux你用对了吗?

    前面我们介绍 redux 三大原则的时候提到过,修改 state 编写 reducer,且 reducer 必须是一个纯函数,那么问题来了,什么是纯函数呢?...除了上面说的在纯函数内部不能修改外部变量,在函数内部调用 Dom api 修改页面、发送 ajax 请求,甚至调用 console.log 打印日志都是副作用,在纯函数中都是禁止的,也就说,在纯函数内部我们一般只做计算数据的工作...为什么reducer需要返回一个全新的state 上面我们介绍了什么是纯函数,redux 里面规定 reducer 必须是一个纯函数,并且每个纯函数需要返回一个全新的state,那么这里大家肯定就有一个疑问...immer 上面我们已经分析了 redux 里面的 reducer 为什么返回一个全新的 state,但是,如果按照上面 reducer 的写法,修改的 state 树层级深了之后,修改起来无疑是非常麻烦的...的相关概念,什么是纯函数,以及为什么 reducer 需要返回一个全新的 state ?

    58530

    React+Redux仿Web追书神器

    #redux中的reducers,处理action发送的数据流 ├─router...#路由管理模块 ├─store #redux中的store,联结reducers └─template...中间件引人日志中间件 —— redux-logger,异步 API 调用 —— redux-thunk 等; component-module 和 components 存放的都是 react 组件,区别是...最后,大概花了 3 天看了阮一峰老师写的 Redux 入门教程 这部分内容是后面在搭建项目整体结构的时候看的,对于 reducers、action、store 的内容比较深入,加深理解。...提 Issues 的话符合一定规范,一开始感觉麻烦,后来看了 提问的智慧,恍然大悟这部分的必要性。 扩展内容 功能扩展 讨论区数据统计分析,主要想知道一段时间的热点内容。

    1.6K80

    Redux介绍及源码解析

    // 所需要传递的自定义参数};dispatch(todoAdded);action creator 是一个纯函数, 是从 Flux 架构中出现的, 他是一种统一集中式管理 action 的思路, 为什么要使用...但是不能够直接去修改他, 必须通过 reducer 去修改他, 不过 Redux 并没有对 State 的修改做任何保护措施, 所以在我们代码中严格避免直接修改 State 的这种情况. 3、 Reducer...如上面 disptach 流程所示, subscribe 将在任何一个 action 被执行完后调用, 虽然 Redux 没有传递任何参数给到 subscribe 的 listener, 但是在监听器中可以调用...● 可以看出 state 集合的管理 与 reducer 集合的管理相互呼应, 对象的key值一直, 不然 combineReducers 中无法找到相应的状态, 类似如下const state...当然, 现在官方已经开始推荐使用 redux-toolkit, 他是基于 Redux 的最佳实践, 简化了 Redux 的编写调用, 他采用了函数式、柯里化等编程思维, 具体差异可以参考官方说明.

    2.5K20

    Taro 小程序开发大型实战(四):使用 Hooks 版的 Redux 实现应用状态管理(上篇)

    创建 Redux Store Redux 的三大核心概念为:Store,Action,Reducers: •Store:保存着全局的状态,有着 ”数据的唯一真相来源之称“。...整合 Redux 和 React 当我们编写了 reducers 创建了 store 之后,下一步考虑的就是如何将 Redux 整合进 React,我们打开 src/app.js,对其中的内容作出如下修改...•然后,我们在 LoginButton 函数式组件中调用 useDispatch Hooks 来返回我们的 dispatch 函数,我们可以用它来 dispatch action 来修改 Redux store...Selector 会在组件每次渲染时调用。useSelector 同样会订阅 Redux store,在 Redux action 被 dispatch 时调用。...•接着我们使用了两次 useSelector 分别从 Redux Store 里面获取了 nickName 和 avatar,它们位于 state.user 属性下。

    2.2K21

    【THE LAST TIME】从 Redux 源码中学习它的范式

    而学习 Redux,也并非它的源码有多么复杂,而是他状态管理的思想,着实值得我们学习。 讲真,标题真的是不好取,因为本文是我写的 redux 的下一篇。两篇凑到一起,才是完整的 Redux。...「**Redux** 的 Middleware 说白了就是对 dispatch 的扩展,或者说重写,增强 dispatch 的功能!」 一般我们常用的可以记录日志、错误采集、异步调用等。...感兴趣的可以查看详细的介绍:Redux 中文文档 Middleware 演化过程 记录日志的功能增强 需求:在每次修改 state 的时候,记录下来 修改前的 state ,为什么修改了,以及修改后的...)(x) 的方式调用。...compose的运行结果是一个函数,调用这个函数所传递的参数将会作为compose最后一个参数的参数,从而像'洋葱圈'似的,由内向外,逐步调用

    40030
    领券