Redux:pre
If you aren't familiar with state management libraries like Redux or MobX, don't use context. For many practical applications, these libraries and their React bindings are a good choice for managing state that is relevant to many components. It is far more likely that Redux is the right solution to your problem than that context is the right solution.
React中有个名为context的API,它能帮我们在组件树中传递数据,然而官方文档强调不推荐我们使用,它认为大多数情况下这个api不是必要的,而且可能会影响React应用的稳定。这个属于试验性质的API在未来可能会被取缔。Redux或Mobx是推荐的选择。所以我不研究context了。
Redux的创造者强调,redux不是必须的。但是,我们既然学了React,自然要了解下Redux是个什么鬼。redux的作者一开始想写一个针对React的状态管理插件,然后写出了redux这东西,并把它称作: “ a predictable state container for JavaScript apps”(js应用的可预测状态容器),可以和其他构建视图层的框架使用。Redux借鉴了Facebook的Flux,但有意避开了Flux的复杂性。
开始学习Redux基础之前,文档给我们讲了6个点,现在只需要关注前三个:
1.Motivation
随着SPA复杂度增强,我们会有许多状态量要控制,有的来自服务器响应、有的来自本地存储、有的来自运行时创建的数据。而且有些状态是共享的,某个状态改变之后,会引起连锁导致其他视图组件更新。这时候我们管理状态、追踪状态变化会很麻烦。为了使得状态变得可控,即“ how and when updates can happen”,Redux试图对此施加明确的限制。
2.Core Concepts
在React中,我们改变state用的是其所在组件的setState方法;在Redux中,为了使得state的改变更可控、对开发者更友好(可见),它不直接使用setState,而是用js设计了一个中间层。其中的两个关键字是“action”和“reducer”。
action:
当我们要触发一个state的改变时,我们(按照redux的规矩)要先dispatch(派遣、发送)一个action。所谓action,就是一个纯js对象,其属性包括:触发state改变的原因/描述、state更新可能需要的数据。如:
{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }
reducer:
要使得action能和state的更新联系起来,我们需要写一个函数,这个函数就是reducer,它把state和action作为参数,并返回一个新的、改变后的state的状态。因此,当追踪state的改变时,我们可以定位在reducer函数中,查看其action参数,从而确定state变化的原因。
function visibilityFilter(state = 'SHOW_ALL', action) {
if (action.type === 'SET_VISIBILITY_FILTER') {
return action.filter
} else {
return state
}
} function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return state.concat([{ text: action.text, completed: false }])
case 'TOGGLE_TODO':
return state.map(
(todo, index) =>
action.index === index
? { text: todo.text, completed: !todo.completed }
: todo
)
default:
return state
}
}
上面是文档中两个reducer函数的示例,它们都接收了带默认值的state、action,并返回更新后的state。其中第二个示例根据action的type执行对应的更新。这让state更新的诱因一目了然。
3.Three Principles
Single source of truth:
在读react文档的时候好几次出现这短语,根据维基的解释,意思是:在信息系统中,数据只需要存储一次,往后其他地方对该数据的连接/使用都只能通过引用的方式。一般的实现方式是创建一个单例,把数据按某种结构存放其中,而外部的其他代码要用到里面的某个数据时,引用它。
Redux中,app的所有state都存放在一个叫store的单例中,并以对象树的结构组织起来。
State is read-only:The only way to change the state is to emit an action, an object describing what happened.
如前面所述,在Redux中,改变state的方式不再是使用setState,而是dispatch一个action,并在reducer函数中返回新的更新后的state。dispatch也是单例store的一个api,用于触发state更新。
store.dispatch({
type: 'COMPLETE_TODO',
index: 1
}) store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
})
Changes are made with pure functions:
reducer只是纯粹的函数,返回的是一个新的state对象。
*4.Prior Art:这章主要讲redux和flux等插件的异同,可以直接跳过,有兴趣再细看
只是里面提到几个点:
1.不鼓励在reducer中改变state,而是返回一个新的state。用Object.assign()或对象扩展运算符{...obj,name:value}手段很轻易能实现。
2.redux中不在意你用什么形式组织state,用纯粹js对象形式、Immutable object(Immutable 是一款js插件)或其他。
*3.作者推荐使用RxJS和Redux一起构建复杂的异步应用,这个先不管。
5.Ecosystem:提到了redux相关的一些插件
6.Examples:一些小示例
Redux:pre的更多相关文章
- YII报错笔记:<pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized string offset: 0' in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778
YII常见报错笔记 报错返回的代码如下: <pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized str ...
- Redux:从action到saga
前端应用消失的部分 一个现代的.使用了redux的前端应用架构可以这样描述: 一个存储了应用不可变状态(state)的store 状态(state)可以被绘制在组件里(html或者其他的东西).这个绘 ...
- Redux:with React(一)
作者数次强调,redux和React没有关系(明明当初就是为了管理react的state才弄出来的吧),它可以和其他插件如 Angular, Ember, jQuery一起使用.好啦好啦知道啦.Red ...
- 我的第五个网页制作:pre、html转义、abbr标签的使用
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- redux:基于函数式编程的事件处理和状态维护机制
redux = monand + pipeline + highorder componet + decouple + middleware redex = store based + event h ...
- redux+flux(一:入门篇)
React是facebook推出的js框架,React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架.也就是说,你至少要学两样东西,才能基本满足需要:React + 前端框架. Faceb ...
- 通过Redux源码学习基础概念一:简单例子入门
最近公司有个项目使用react+redux来做前端部分的实现,正好有机会学习一下redux,也和小伙伴们分享一下学习的经验. 首先声明一下,这篇文章讲的是Redux的基本概念和实现,不包括react- ...
- 读redux有感: redux原来是这样操作的。
2017.9.10日 教师节 : ~当一个事物你没有接触,但是生活中 常常用到他,你就不得不去了解他了. 注:新手可以看一下,毕竟博主也是个菜鸟,没法写高深的东西,不想看博主扯淡的直接看第三节啦~~ ...
- React:redux+router4搭建应用骨架
可能是短期内关于react的对后一篇笔记.假设读者对redux和router4有基本了解. 缘由: 现在网上很多关于react+redux的文章都是沿用传统的文件组织形式,即: |--componen ...
随机推荐
- Windows系统安装最新版本RabbitMQ3.8.3及报错解决
今天想安装下RabbitMQ写几个用例看下,发现最新的安装包有些问题,不能直接安装使用,遇到一些问题,记录一下解决办法. 下载安装包 因为RabbitMQ是Erlang编写,安装时,需要先安装Erla ...
- 闲聊http1.1的6个方法
GET :获取资源GET 方法用来请求访问已被 URI 识别的资源.指定的资源经服务器端解析后返回响应内容. POST :传输实体主体POST 方法用来传输实体的主体.虽然用 GET 方法也可以传输实 ...
- DDOS攻击攻击种类和原理
DoS攻击.DDoS攻击和DRDoS攻击相信大家已经早有耳闻了吧!DoS是Denial of Service的简写,就是拒绝服务,而DDoS就是Distributed Denial of Servic ...
- java中使用Semaphore构建阻塞对象池
java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...
- pvresize
lvm pv 扩容 pvresize 当PV对应的设备分区(如md软raid)扩容之后,利用该命令可以扩容PV
- 数学--数论--欧拉降幂--P5091 欧拉定理
题目背景 出题人也想写有趣的题面,可惜并没有能力. 题目描述 给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm 输入格式 一行三个整数,a, ...
- springboot利用redis实现分布式锁(redis为单机模式)
1.pom文件添加redis支持 <dependency> <groupId>org.springframework.boot</groupId> <arti ...
- E. Yet Another Task with Queens(分类思想)
\(\color{Red}{描述}\) \(在n*n的棋盘上有m个K皇后,每个皇后可能被来自8个方向的其他皇后攻击\) \(每个皇后只可能被(0-8)只皇后攻击,分别求出被(0-8)只皇后攻击的皇后数 ...
- P2422 良好的感觉(两头单调)
描述:https://www.luogu.com.cn/problem/P2422 kkk做了一个人体感觉分析器.每一天,人都有一个感受值Ai,Ai越大,表示人感觉越舒适.在一段时间[i, j]内,人 ...
- CSS 块元素、内联元素、内联块元素三者的区别与转换
三种元素 块元素 内联元素 内联块元素 元素之间的转换 三种元素 元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素. 了解这三种元素的特性,才能熟练的进行页面布局. 块元素 块元素, ...