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的更多相关文章

  1. YII报错笔记:<pre>PHP Notice &#039;yii\base\ErrorException&#039; with message &#039;Uninitialized string offset: 0&#039; in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778

    YII常见报错笔记 报错返回的代码如下: <pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized str ...

  2. Redux:从action到saga

    前端应用消失的部分 一个现代的.使用了redux的前端应用架构可以这样描述: 一个存储了应用不可变状态(state)的store 状态(state)可以被绘制在组件里(html或者其他的东西).这个绘 ...

  3. Redux:with React(一)

    作者数次强调,redux和React没有关系(明明当初就是为了管理react的state才弄出来的吧),它可以和其他插件如 Angular, Ember, jQuery一起使用.好啦好啦知道啦.Red ...

  4. 我的第五个网页制作:pre、html转义、abbr标签的使用

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. redux:基于函数式编程的事件处理和状态维护机制

    redux = monand + pipeline + highorder componet + decouple + middleware redex = store based + event h ...

  6. redux+flux(一:入门篇)

    React是facebook推出的js框架,React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架.也就是说,你至少要学两样东西,才能基本满足需要:React + 前端框架. Faceb ...

  7. 通过Redux源码学习基础概念一:简单例子入门

    最近公司有个项目使用react+redux来做前端部分的实现,正好有机会学习一下redux,也和小伙伴们分享一下学习的经验. 首先声明一下,这篇文章讲的是Redux的基本概念和实现,不包括react- ...

  8. 读redux有感: redux原来是这样操作的。

    2017.9.10日 教师节 : ~当一个事物你没有接触,但是生活中 常常用到他,你就不得不去了解他了. 注:新手可以看一下,毕竟博主也是个菜鸟,没法写高深的东西,不想看博主扯淡的直接看第三节啦~~ ...

  9. React:redux+router4搭建应用骨架

    可能是短期内关于react的对后一篇笔记.假设读者对redux和router4有基本了解. 缘由: 现在网上很多关于react+redux的文章都是沿用传统的文件组织形式,即: |--componen ...

随机推荐

  1. SESSION劫持

    服务端和客户端之间是通过session(会话)来连接沟通.当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session.每个用户的session都是独立的,并且由服务器来维护.每个用户的s ...

  2. bootstrop登陆页面

    bootstrap做登入注册页面,使用validate做表单验证 技术:bootstrap,font-awesome,jquery-validate: 特点:响应式布局,表单验证(用户两次密码是否相同 ...

  3. sed命令的正则表达式实践

    1. 取系统ip [root@oldboy logs]# ifconfig eth3 eth3 Link encap:Ethernet HWaddr 08:00:27:4C:6F:AD inet ad ...

  4. 高性能服务器开发基础系列 (二)Reactor模式

    系列目录 第01篇 主线程与工作线程的分工 第02篇 Reactor模式 第03篇 一个服务器程序的架构介绍 第04篇 如何将socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于 ...

  5. Linux下进程的创建(system(); fork(); exec*())

    0. system(); system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(): 特点:原进程和子进程各自运行,且原进程需要等子进程运行完后 ...

  6. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

  7. Codeforce 1255 Round #601 (Div. 2)B. Fridge Lockers(思维)

    Hanh lives in a shared apartment. There are nn people (including Hanh) living there, each has a priv ...

  8. DAG的深度优先搜索标记

    这是图论的基础知识点,也是学习Tarjan的导学课. 一.知识 对于在图G上进行深度优先搜索算法所产生的深度优先森林Gt,我们可以定义四种边的类型: 1.树边(Tree Edge):为深度优先森林中G ...

  9. HDU 1233 最小生成树模板题,练练模板

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. undef用法

    #undef的语法 定义:#undef 标识符,用来将前面定义的宏标识符取消定义. 整理了如下几种#undef的常见用法. 1. 防止宏定义冲突在一个程序块中用完宏定义后,为防止后面标识符冲突需要取消 ...