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. 9、flink的状态与容错

    1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...

  2. [Batch脚本] if else 的格式

    必须写成一行 ) else (,否则报错. if %abc%=="yes" ( ... ) else ( ... )

  3. 梁国辉获Yes评分表系统3.0计算机软件著作权

    梁国辉获Yes评分表系统3.0计算机软件著作权 Liang Guohui won the Yes score system 3 computer software copyright 登记证书如下 R ...

  4. 在java中构建高效的结果缓存

    文章目录 使用HashMap 使用ConcurrentHashMap FutureTask 在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件.除了第三方缓存以外,我们通常也需要在j ...

  5. 如何装双系统win10下装Ubuntu

    如何装双系统win10下装Ubuntu 第一步 制作启动盘 下载UItraISO软件.下载Ubuntu系统(地址:https://www.ubuntu.com/download).准备一个大于8g的U ...

  6. 听说你在从事前端开发?那这10个JavaScript的优化问题你不得不知道!

    JavaScript的高效优化一直都是我们前端开发中非常重要的工作,也是很多开发人员无法做好的一部分内容,今天我总结了10个优化问题,大家可以参考来做优化,这其中很多问题都是大家经常遇到的哦. ==和 ...

  7. java中异常的处理

    异常分为运行时的异常和检测异常: java提供了两种异常机制.一种是运行时异常(RuntimeExepction),一种是检查式异常(checked execption). 运行时的异常就是在java ...

  8. Android Room SQLite持久层框架

    原文链接 前言 Android中提供了SQLite数据库进行数据的持久化 ,并提供了对应API访问数据库,而Room框架提供了SQLite数据访问抽象层,为高效的数据库访问层带来便捷 APP可以缓存用 ...

  9. Docker安装和基本操作

    一.Docker安装 CentOS7安装Docker CE $sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $sud ...

  10. 运用shell脚本 执行sftp,ftp命令

    sftp文件上传(从本地上传到远程) #!/bin/bash #远程上传文件测试 if [ $# -ne 2 ] then echo "miss arguments" echo & ...