Redux 知识点梳理和实践
之前在有道云笔记上写过一篇 Redux 学习实践的文章,附带了一个小 Demo。由于一段时间没看 Redux,加上之前缺乏足够的练习,现在想重构个人博客,使用 Redux 进行状态。现在不得不回头再看看 Redux 相关东西。这里顺便记录下学习笔记,一来便于回顾,二来希望对他人有所帮助。笔记同步写在个人博客网站
这篇文章是知识点的梳理,如果你对 Redux 的基础有一定了解,阅读起来可能比较合适。
什么是 Redux?
Redux 可以说是 Flux 架构思想的最佳实践方案,用于对大型、复杂、多数据来源的 React 进行数据管理。遵循 Redux 的设计原则,再配合 React 容器组件、展示组件分离的代码组织原则,可以让我们的项目结构清晰,数据流清晰,十分利于项目的维护开发。
Redux 设计的三大原则
- 单一的数据来源,所有的数据保存在一个对象中。
- 状态只读,Reducer 根据 store dispatch 的 action 类型返回一个新的状态,不修改原来的状态。
- 状态修改均由纯函数完成。
关于这三大原则的深入理解建议参考 《深入React技术栈》、《深入浅出React和Redux》
浅谈 Redux 的工作过程(和 MVC 的主要区别)
有 MVC 框架使用经验的同学应该清楚,MVC 的工作过程是这样:view 层将用户行为传递到 controller 中的action, controller 中的 action 和 Model 层交互操作数据,返回到 view。通常 MVC 框架的实现 M 和 V 层是可以交互的,这样数据就不是单向流动,这种设计很多场景下很灵活,写起来很爽快,但是要项目过大,项目数据流复杂,项目维护就不爽了。
Redux 则严格遵循上面提到的设计三大原则,工作过程是这样的:view 层触发一个 action,这个 action 由 store.dispatch(action) 传递给 reducer,reducer 根据 previousState 和 action type 返回一个新的 state(不修改数据), 如此实现了数据的变更。
Redux 核心 API
上面 Redux 的工作过程提到了 Redux 有 store、action、reducer 这些概念,这些都是 Redux 对外提供的核心 API,我们来看看他们分别是干嘛的。
store
store 作为整个应用数据的唯一来源,用于保存数据和 dispatch action。store 使用 Redux 提供的 createStore 方法来生成。
import { createStore } from 'redux';
let store = createStore(reducer)
createStore 接受一个 reducer 作为参数,返回一个 store 对象。store 对象包含 4 中方法:
getState():// 用于获取 store 中当前的状态
dispatch():// 用于分发 action,这个是改变 store 中数据的唯一方式
subscribe(listener):// 注册一个监听者,在 store 发生变化时被调用
replaceReducer(nextReducer):///更新当前 store 中的 reducer
reducer
reducer 本质上是一个函数,这个函数能接受一个 action 和一个旧的状态(previousState),根据 previousState 和 action 返回新的状态
reducer(previousState, action) => newState
reducer 必须是一个纯函数,不能修改原来状态,关于纯函数的概念请阅读其他资料学习。
action
reducer 的 action 本质上是一个 javaScript 对象,这个对象必须有一个 type 属性,用来表明 action 的类型,还可以有 payload, error, meta 属性。关于 action 对象的属性,社区有个规范,可以参考github.com/redux-utili…
const action = {type: 'ADD_TODO',payload: 'todo'
}
reducer 就是根据 action type 属性来决定返回新的 state。
先睹为快
我在学习 Redux 的时候,看了很多文档,认为对 Redux 的概念了然于胸,但是动手写第一个小 Demo 的时候仍然觉得很难下手,可能是 Redux 这些概念对我而言太新。这里给出我写的第一个小 Demo。
这个 Demo 实现了点击按钮让数字加一减一的功能,没有任何复杂度,单纯的是为了了解 action
、store
、reducer
的具体作用和协作关系。
Demo 地址: github.com/wewin11235/…
为了便于观察,Demo 的代码都丢在了一个文件里,在实际开发中,一定要遵循好的代码组织原则。
import React from 'react';
import ReactDOM from 'react-dom';// 创建 action
// action 是 javaScript 对象,是用户行为的抽象,必须包含一个 stype 字段
// 根据 Demo 需要实现记数功能,抽象出两种 action, 一种表示加,一种表示减
const incream_action = { type: 'INCREAM' };
const decream_action = { type: 'DECREME' };// 创建 reducer
// reducer 接受一个 previousState 和 action 返回一个新的 state
const reducer = (state=0, action) => {switch (action.type) {case incream_action.type:return state + 1;case decream_action.type:return state - 1;default:console.log('default');return state;}
}// 创建 store
// store 创建使用 createStore(reducers)
// createStore 由 redux 提供
import { createStore } from 'redux';
let store = createStore(reducer);// 创建计数组件
class Counter extends React.Component {constructor(props) {super(props);}render() {const { count, doIncrement, doDecrement } = this.propsreturn(<div><span>{count}</span><button onClick={doIncrement}>+</button><button onClick={doDecrement}>-</button></div>)}
}const render = () => ReactDOM.render(<Countercount={store.getState()}doIncrement={() => store.dispatch(incream_action)}doDecrement={() => store.dispatch(decream_action)}/>,document.getElementById('root')
);render();// 为了能在 store 发生变化后能刷新页面,需要给 store 注册一个监听事件
// store 变化后,刷新页面
store.subscribe(render);
最小 Redux 应用诞生。
欢迎指正,补充!
本文来源: 掘金 如需转载请联系原作者
Redux 知识点梳理和实践相关推荐
- Python培训教程之Python基础知识点梳理
Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...
- SQL重要知识点梳理!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale成员 有读者留言面试有点虚 ...
- 四年级下册英语计算机房和教师办公室的图片,PEP英语四年级下册-Unit-1思维导图及知识点梳理.pptx...
PEP英语四年级下册-Unit-1思维导图及知识点梳理.pptx (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 四年级 下册 U ...
- 【数据分析】数据分析基础:SQL重要知识点梳理!
作者:牧小熊,华中农业大学,Datawhale成员 有读者留言面试有点虚,数据库都忘的差不多了,与其临时抱佛脚,不如我们把MySQL的知识点梳理一遍,心中有知识点,面试不慌. 数据库的话我只对MySQ ...
- Python教程:Python基础知识点梳理!
Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小千就来给大家分享一篇Python基础知识点梳理. 1.Pyth ...
- Python教程分享之Python基础知识点梳理
Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小千就来给大家分享一篇Python基础知识点梳理. Python ...
- ap计算机科学课程内容,AP计算机科学课程补习有哪些知识点梳理?
计算机作为当前最被看好的一大专业领域,很多同学们在AP课程学习期间会选修AP计算机科学课程补习这门课来帮助自己打好知识基础.那么AP计算机科学课程补习有哪些知识点梳理?今天学通国际教育老师为大家介绍. ...
- 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...
不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...
- 计算机三级教材重点网络技术,2020年计算机三级网络技术知识点梳理:身份认证...
[导语]计算机三级考试备考模式已启动,目前这个阶段,该强化一下自己对于教材考点的记忆,及时查漏补缺.下面无忧考网为您精心整理了2020年计算机三级网络技术知识点梳理:身份认证,更多计算机三级考试的备考 ...
最新文章
- Git连载(9)使用Eclipse作为Git客户端
- shellcode 编码技术
- Eclipse开发过程中个VM Arguments的设置
- vsftpd虚拟用户和本地用户不能共存的解决方法
- 2021牛客暑期多校训练营2 L-WeChat Walk(分块)
- 教你玩转CSS 图像透明/不透明
- 类的定义 java 1613806383
- python程序员工作时间_黑马程序员:Python编程之时间和日期模块
- Composer + thinkphp5.1安装与使用
- Atitti 摘要算法 散列算法SHA1 和 MD5 crc32 目录 1.1. CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长	1 1.1.1. 数据摘要算
- 用于Linux系统/网络管理的nmap命令的实例
- matlab二元非线性拟合,求助matlab多元非线性公式拟合
- 如何制作一面智能镜子
- matlab中的标识符命名规则有哪些,关于标识符的命名规则,以下描述错误的是
- 崔羚:乳品行业后道包装及物流解决方案
- mac安装golang,编写第一个go程序
- LAYUI 表格 嵌套JSON不能显示的解决方法
- STM32F105RCT6使用CubeMX初始化工程——3:初始化ADC采样
- 物联网核心技术M2M的构成、基本特征和应用类别
- ActionScript 大型网页游戏开发