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 ...
随机推荐
- [机器学习实战-Logistic回归]使用Logistic回归预测各种实例
目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...
- tp5--数据库查询的常用操作
首先,我们要先明确,我们平时经常使用那些操作,我看了开发手册,主要是连贯操作比较多. 连贯操作有: field, order, limit, page, GROUP, HAVING, cache, 其 ...
- UML由浅入深
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
- 文件包含漏洞(pikachu)
文件包含漏洞 在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用'包含'函数功能,比如把一系列功能函数都写进function.php中,之后当某个文件需要调用的时候,就直接在文 ...
- 解决Oracle在命令行下无法使用del等键问题
前言: Oracle使用Linux命令行进行编辑? 有PL/SQL development,SQL development等工具,为何用Linux命令行? 但也免不了有用的的时候 以下是解决在Linu ...
- Python 输出 log 到文件的方法
import loggingfrom logging.handlers import RotatingFileHandler module_name = "test_module" ...
- 【集群实战】Rsync常见错误总结
1. 服务端指定模块没有对应目录 报错详情: @ERROR: chdir failed rsync error: error startingclient-server protocol (code ...
- 深入实践Spring Boot1.4 运行与发布
1.4 运行与发布 本章实例工程的完整代码可以使用IDEA直接从GitHub的https://github.com/chen-fromsz/spring-boot-hello.git中检出,如图1-1 ...
- JAVA编程思想 Ch3.6题
练习6:在练习5的基础上,创建一个新的Dog索引,并对其赋值为Spot对象.测试用==和equals()方法来比较引用结果. public class quan { String name; Stri ...
- unittest(@classmethod 装饰器)
1.前言: 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不 ...