Redux框架之combineReducers() 用法讲解

简介: Redux框架之combineReducers() 用法讲解

combineReducers()

随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分。

combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的

object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore。

合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。

最终,state 对象的结构会是这样的:

{
  reducer1: ...
  reducer2: ...
}


通过为传入对象的 reducer 命名不同来控制 state key 的命名。例如,你可以调用 combineReducers({ todos: myTodosReducer, counter: myCounterReducer }) 将 state 结构变为 { todos, counter }。

通常的做法是命名 reducer,然后 state 再去分割那些信息,因此你可以使用 ES6 的简写方法:combineReducers({ counter, todos })。这与 combineReducers({ counter: counter, todos: todos }) 一样

参数

image.png

image.png

返回值

image.png

注意点

本函数设计的时候有点偏主观,就是为了避免新手犯一些常见错误。也因些我们故意设定一些规则,但如果你自己手动编写根 redcuer 时并不需要遵守这些规则。

每个传入 combineReducers 的 reducer 都需满足以下规则:

image.png

示例

reducers/todos.js

export default function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    return state.concat([action.text])
  default:
    return state
  }
}

reducers/counter.js

export default function counter(state =0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state +1  case 'DECREMENT':
    return state -1  default:
    return state
  }
}

reducers/index.js

import { combineReducers } from 'redux'import todos from './todos'import counter from './counter'export default combineReducers({
  todos,
  counter
})

App.js

 createStore } from 'redux'
import reducer from './reducers/index'
let store = createStore(reducer)
console.log(store.getState())
// {
//   counter: 0,
//   todos: []
// }
store.dispatch({
  type: 'ADD_TODO',
  text: 'Use Redux'
})
console.log(store.getState())
// {
//   counter: 0,
//   todos: [ 'Use Redux' ]
// }


本方法只是起辅助作用!你可以自行实现不同功能的 combineReducers,甚至像实现其它函数一样,明确地写一个根 reducer 函数,用它把子 reducer 手动组装成 state 对象。

在 reducer 层级的任何一级都可以调用 combineReducers。并不是一定要在最外层。实际上,你可以把一些复杂的子 reducer 拆分成单独的孙子级 reducer,甚至更多层。

相关文章
|
JavaScript 前端开发 API
core-js介绍及安装使用
core-js介绍及安装使用
core-js介绍及安装使用
WK
|
数据可视化 开发者 容器
QWidget类
QWidget 是 Qt 框架中的基础类,用于创建用户界面的可视化组件。它是所有 UI 组件的基类,提供绘制、布局、事件处理、样式设置和部件通信等功能。常见子类包括 QMainWindow、QDialog、QPushButton 等,支持灵活的窗口管理和丰富的用户交互。
WK
275 3
|
关系型数据库 MySQL 数据库
实时计算 Flink版操作报错之连接读库时出现报错,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
前端开发
vue3 【提效】使用 CSS 框架 UnoCSS 实用教程
vue3 【提效】使用 CSS 框架 UnoCSS 实用教程
893 1
|
移动开发 Dart 前端开发
深度分析:React Native、Flutter、UniApp、Taro、Vue的差异
深度分析:React Native、Flutter、UniApp、Taro、Vue的差异
1098 6
|
JavaScript 前端开发
Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能
使用React Hooks实现connect功能,通过createStore创建仓库,Provider提供store,useSelector获取state,useDispatch触发action,从而在函数式组件中管理状态,替代类组件中的connect功能。
173 5
Hooks使用createStore、Provider、useSelector、useDispatch实现connect功能
|
安全 Shell Linux
|
测试技术 UED
软件测试的科学与艺术:从数据导向到逻辑严密的实践
本文旨在探讨软件测试领域中数据导向和逻辑严密性的重要性,并分析如何通过科学严谨的方法提升测试效率和质量。文章首先概述了软件测试的基本概念和挑战,随后深入讨论了数据在测试设计和结果分析中的关键作用,以及如何利用逻辑推理来构建有效的测试案例和识别潜在缺陷。最后,本文提出了一系列实践建议,旨在帮助测试人员更好地整合数据驱动和逻辑推理方法,以实现软件测试的最优化。
200 0
|
资源调度 JavaScript 前端开发
【TypeScript】TS类型声明文件
【TypeScript】TS类型声明文件
438 0
|
前端开发 JavaScript
React-Router-手动路由跳转
React-Router-手动路由跳转
258 0