资源一:

In React JS Tutorials, lectures from 9.

From: React高级篇(一)从Flux到Redux,react-redux

从Flux到Redux,再到react-redux,从这个简短历程中,我们可以看到框架设计上的演进,而redux + react-redux也是React开发万家桶的标配。

到了这里,可以忘记Flux啦~

资源二:

[React] 07 - Flux: react communicates with mongodb

[React] 11 - Redux: redux

[React] 12 - Redux: async & middleware

[React] 13 - Redux: react-redux

[React] 14 - Redux: Redux Saga

[React] 15 - Redux: TodoMVC

资源三:

文档:https://redux.js.org/basics/example-todo-list

文档:Redux 官方TODO示例解析

代码:redux/examples/todomvc/

结合Redux-saga 中文文档,乃高手必备之物。

江湖有云:先实践一下,然后再看以上文档和示例代码。

单向流 Flux


一、实现一个简单的例子

详述:[React] 07 - Flux: react communicates with mongodb

实现的思路要点:

1. 在store中有一个数组(state)来表现new item。

2. 点击按钮,发送信号(action),改变状态,view监听到状态后刷新(重新表现items)

二、有什么弊端

dispatch与store的问题,过于灵活。

参考:[React] 02 - Intro: why react and its design pattern - 背后的思想:一步一步进化到 Redux

学习: 《看漫画,学 Redux》 —— A cartoon intro to Redux

问题1:store 的代码无法被热替换,除非清空当前的状态

改变下store的代码,状态没了!不利于调试(热替换)。

分开保存即可。

问题2:每次触发 action 时状态对象都被直接改写了

旧状态管理不稳定,不好实现 “跳回到这个对象之前的某个状态(想象一个撤销功能)”。

当一个 action 需要 store 响应时,将状态拷贝一份并在这份拷贝的状态上做出修改。

问题3:没有合适的位置引入第三方插件

一个简单的例子就是日志。比如说你希望 console.log() 每一个触发的 action 同时 console.log() 这个 action 被响应完成后的状态。

在 Flux 中,你只能订阅(subscribe) dispatcher 的更新和每一个 store 的变动。

但是这样就侵入了业务代码,这样的日志功能不是一个第三方插件能够轻易实现的。

(1) 将这个架构的部分功能包装进其他的对象(中间件)中将使得我们的需求变得更容易实现;

Goto: [React] 12 - Redux: async & middleware

(2) 使用一个树形结构来组织所有改变状态的逻辑。

进化论 Redux


一、要点概述

学习: 《看漫画,学 Redux》 —— A cartoon intro to Redux

1. Action creators

保留了 Flux 中 action creator 的概念。

Redux 中的 action creator 不会直接把 action 发送给 dispatcher,而是返回一个格式化好的 JavaScript 对象。

2. The store

Redux 中的 store 首先会保存整个应用的所有状态,然后将判断 "哪一部分状态需要改变" 的任务分配下去。

而以 root reducer 为首的 reducer 们将会承担这个任务。

store 已经完全接管了 dispatch 相关的工作。

3. The reducers

当 store 需要知道一个 action 触发后状态需要怎么改变时,他会去询问 reducer。

Root reducer 会根据状态对象的键(key)将整个状态树进行拆分,然后将拆分后的每一块子状态传到知道该怎么响应的子 reducer 那里进行处理。

【状态树,子状态,子 reducer】

4. 拷贝state后修改

这是 Redux 的核心思想之一。不直接修改整个应用的状态树,而是将状态树的每一部分进行拷贝并修改拷贝后的部分,然后将这些部分重新组合成一颗新的状态树。

子 reducers 会把他们创建的副本传回给根 reducer,而根 reducer 会把这些副本组合起来形成一颗新的状态树。最后根 reducer 将新的状态树传回给 store,store 再将新的状态树设为最终的状态。

如果你有一个小型应用,你可能 只有一个 reducer 对整个状态树进行拷贝并作出修改。

又或者你有一个超大的应用,你可能会有 若干个 reducers 对整个状态树进行修改。这也是 Flux 和 Redux 的另一处区别。

在 Flux 中,store 并不需要与其他 store 产生关联,而且 store 的结构是扁平的。

而在 Redux 中,reducers 是有层级结构的。这种层级结构可以有若干层,就像组件的层级结构那样。

4.1 Immutable for Object

4.2 concat for Array

4.3 filter for Array

4.4 定制化 硬拷贝

详情请见: [React] 11 - Redux: redux

二、教程学习

React JS Tutorials - Redux部分

  • starter 框架
  1. import { createStore } from "redux";

  2. (2) 接收到动作信号
  3. const reducer = (initialState=0, action) => {
  4.   ...
  5. }
  6.  
  7. const store = createStore(reducer, 1)
  8.  
  9. (3) 触发事件
    /* 每次 state 改变的时候会执行一次这个函数 */
  10. store.subscribe(() => {
  11. console.log("store changed", store.getState());
  12. })

  13. (1) 发生一次用户动作
  14. // store.dispatch({type: "INC"})

添加了更多的动作,触发了更多的事件。

  • combineReducers 框架

Jeff: 多reducer的情况的处理方式。

  1. import { combineReducers, createStore } from "redux";

  2. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  3. /**
    * 放在单独的文件里为好
    */
    const userReducer = (state={}, action) => {
  4. switch(action.type) {
  5. case "SET_NAME": {
  6. return {...state, name: action.payload};
  7. break;
  8. }
  9. case "SET_AGE": {
  10. return {...state, age: action.payload};
  11. break;
  12. }
  13. }
  14. return state;
  15. }
  16.  
  17. // I would live in a separate file
  18. const tweetsReducer = (state=[], action) => {
  19. switch(action.type) {
  20. case "ADD_TWEET": {
  21. return state.concat({
  22. id: Date.now(), //fake an ID by using a timestamp
  23. text: action.payload,
  24. });
  25. break;
  26. }
  27. }
  28. return state;
  29. }
  30. -------------------------------------------------------------------------------------------------------
  31. const reducers = combineReducers({
  32. user: userReducer,
  33. tweets: tweetsReducer
  34. })
  35.  
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  37.  
  38. const store = createStore(reducers)  // state的默认值可以作为第二个参数,或者放在reducer的第一个init state定义

  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. store.subscribe(() => {
  41. console.log("store changed", store.getState());
  42. })
  43.  
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  45.  
  46. store.dispatch({type: "SET_NAME", payload: "Will"})
  47. store.dispatch({type: "SET_AGE", payload: 35})
  48. store.dispatch({type: "SET_AGE", payload: 34})
  49. store.dispatch({type: "ADD_TWEET", payload: "OMG LIKE LOL"})
  50. store.dispatch({type: "ADD_TWEET", payload: "I am so like seriously like totally like right now"})

请注意:作为对比,上例中的store.dispatch一般会写在onClick中,由用户触发,如下。

  1. const render = () => ReactDOM.render(
  2. <Counter
  3. value={store.getState()}
  4. onIncrement={() => store.dispatch({ type: 'INCREMENT' })}
  5. onDecrement={() => store.dispatch({ type: 'DECREMENT' })}
  6. />,
  7. rootEl
  8. )
  • Middleware 框架

详见请见:[React] 12 - Redux: async & middleware

  • React-redux 框架

详见请见:[React] 13 - Redux: react-redux

  • React-saga 框架

详情可见::[React] 14 - Redux: Redux Saga

[Full-stack] 状态管理技巧 - Redux的更多相关文章

  1. 网页前端状态管理库Redux学习笔记(一)

    最近在博客园上看到关于redux的博文,于是去了解了一下. 这个Js库的思路还是很好的,禁止随意修改状态,只能通过触发事件来修改.中文文档在这里. 前面都很顺利,但是看到异步章节,感觉关于异步说得很乱 ...

  2. React状态管理之redux

    其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...

  3. 微信小程序里使用 Redux 状态管理

    微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...

  4. React + MobX 状态管理入门及实例

    前言 现在最热门的前端框架,毫无疑问是React. React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI. 对于小型应用,引入状态管理库是"奢侈的&qu ...

  5. react的状态管理

    近两年前端技术的发展如火如荼,大量的前端项目都在使用或转向 Vue 和 React 的阵营, 由前端渲染页面的单页应用占比也越来越高,这就代表前端工作的复杂度也在直线上升,前端页面上展示的信息越来越多 ...

  6. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  7. 状态管理(Vuex、 Flux、Redux、The Elm Architecture)

    1.https://vuex.vuejs.org/zh-cn/intro.html (vuex) 这就是 Vuex 背后的基本思想,借鉴了 Flux.Redux.和 The Elm Architect ...

  8. react+redux状态管理实现排序 合并多个reducer文件

    这个demo只有一个reducer 所以合并reducer这个demo用不到 ,但是我写出来这样大家以后可以用到,很好用,管理多个reducer,因为只要用到redux就不会只有一个reducer所以 ...

  9. 借鉴redux,实现一个react状态管理方案

    react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...

随机推荐

  1. memcache bug

    用memcached有时会报错  the lowest two bytes of the flags array is reserved for pecl/memcache 将以前的 $mc-> ...

  2. C语言学习中遇到的小问题(一)

    C语言小白学习C语言的记录1 一.scanf一次性接收连续的数字 1.已知数量,且个数较少:scanf("%d%d%d",&a&b&c); 2.已知数量,但 ...

  3. ssdb安装注意事项

    官网的安装教程依赖于autoconf,需要提前安装.

  4. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

  5. ArcGIS Pro 获得工具的个数

    import arcgisscripting import string; gp = arcgisscripting.create(9.3); ##多少个工具箱 toolboxes = gp.list ...

  6. redis简记

    redis学习笔记 http://doc.redisfans.com/ 键空间通知(keyspace notification) 键空间通知,客户端可以通过订阅频道或者模式来接收redis改动的数据集 ...

  7. Eclipse的预设的Include的路径

    http://www.eclipse.org/community/eclipse_newsletter/2013/october/article4.php 说明链接 http://www.eclips ...

  8. Jquery计算时间戳之间的差值,可返回年,月,日,小时等

    /** * 计算时间戳之间的差值 * @param startTime 开始时间戳 * @param endTime 结束时间戳 * @param type 返回指定类型差值(year, month, ...

  9. Mongodb 笔记 - 性能及Java代码

    性能 以下数据都是在千兆网络下测试的结果 写入 数据量的增大会导致内存占满, 因为mongodb会将数据尽可能地载入内存, 索引占用的空间也很可观非安全模式下, 速度取决于内存是否占满能差一个数量级, ...

  10. VS中项目的循环引用的问题

    这个道理很简单,要编译A,首先要编译A引用的项目B,要编译项目B,必须首先编译B引用的项目A. 那么你说应该先编译哪个项目. 如果你非要循环引用,你不要让A引用项目B,而是直接引用项目B生成的b.dl ...