白话Redux工作原理。浅显易懂。
如有纰漏或疑问,欢迎交流。

Redux 约法三章

唯一数据源(state)

虽然redux中的statereact没有联系,但可以简单理解为react组件中的this.state
html文档只是state的一种表现形式。所有html的数据应该都是直接间接来自于state,否则UI视图是无法因state改变而更新的。

数据源(state)只读

不应该直接修改state数据。
对于数组使用:

Array.prototype.slice()//对数组进行拷贝
//使用ES6:
[...state, ...newState]

对于对象使用:

Object.assign({}, state, change1, change2...)//对对象进行拷贝
//使用ES6:
{...state, ...newState}

通过纯函数(pure function)改变数据源(state)

pure function: 无其他API(包括Math, Date等)调用,无异步操作,preState => newState。

Redux数据流

简单介绍store/reducer/action, 比较简洁,请牢记于心。

store
UI唯一数据来源,可以理解为react中的state,store信息的变化会触发视图更新.

action
对象。必须拥有type属性,用来描述发生什么。可选择携带发生时的数据,如用户输入的input value。切记:仅仅用来表述发生了什么。

reducer
pure function(上面有解释)。根据action.type来做出反应,(preState, action) => newState,生成的state是用来改变store的。

所以,data flow(数据流):

  1. UI发出动作,如click, submit;
  2. action, 描述发生了什么;
  3. reducer处理发生的事情,生成新state;
  4. store被更新;
  5. UI响应store更新
  6. ...

Redux action

举几个例子,可能会比较直观:

{
type: “TOGGLE_TODO”, //这个type属性必须要,必须是字符串
index: 5 //附加信息,自己根据需要选择是否加入
};
{
type: “ADD_TODO”,
text:“学习Redux” //附加信息,这里是input value
}

没别的,就是这么简单。
有时候可以使用action生成器(action creators)来批量生产相似action对象,如:

//我需要根据不同的input value来生成高度相似的action:
function (text) {
return {
type: "ADD_TODO",
text: text //附加的信息
}
}

说明
虽然上面数据流提到,action通过reducer处理生成newState后才能够更改store信息。但是为了更好的语义编程,Redux通过语句store.dispatch(action)来更新store,reducer对action的处理在内部处理。

Redux reducer

很简单

(theState, action) => (newState);
//仅仅只是根据action.type处理一下需要更新的state

来看一个相对完整的reducer:

function todoApp(state = initialState, action) { //注意需要处理undefined情况下的state默认值
switch (action.type) { //根据action.type来判断
case "SET_VISIBILITY_FILTER":
return Object.assign({}, state, {
visibilityFilter: action.filter
})
case “ADD_TODO”: //处理“ADD_TODO”的action type
//返回新state(newState),注意不要直接改变state,对象使用了
//Object.assign()。也可以使用ES的...操作符
return Object.assign({}, state, {
todos: [
...state.todos,
{
text: action.text,
completed: false
}
]
})
case “TOGGLE_TODO”: //处理“TOGGLE_TODO”的action type
return Object.assign({}, state, {
todos: state.todos.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: !todo.completed
})
}
return todo
})
})
default:
return state
}
}

Redux store

store
UI视图唯一数据来源(直接或间接),可以获取state,更新state,监听state变化,取消监听。所以store提供了一下方法:

  1. store.getState() 获取当前state
  2. store.dispatch(action) 更新state
  3. store.subscribe(listener) store更新后回调listener,回调函数里面可以调用store.getStore()来获取更新后得state哟~
  4. 取消listener的方式比较特别:调用一次store.subscribe(sameListner)

ps: 如有纰漏或疑问,欢迎交流。
先写这么多,有时间继续更新。

十分钟理解Redux核心思想,过目不忘。的更多相关文章

  1. 后端技术杂谈11:十分钟理解Kubernetes核心概念

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...

  2. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  3. 十分钟理解JavaScript引擎的执行机制

    关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...

  4. 十分钟理解Gradle

    一.什么是Gradle 简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译.打包等过程.我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建ap ...

  5. 十分钟理解Actor模式

    Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...

  6. Vuejs核心思想学习笔记

    习Vue已经有一段时间了,但未对其核心思想作自己的总结和理解 Vue核心思想有两个 : 数据驱动和组件化(系统组件) 数据驱动 数据驱动目的是让数据和DOM保持同步, 只要修改了data数据,DOM就 ...

  7. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  8. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  9. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

随机推荐

  1. Nginx的启动、停止与重启---linux

    一.选定安装文件目录 可以选择任何目录 cd /usr/local/src 二.安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcr ...

  2. "C++ Primer Plus" is WAY FUCKING BETTER than "C++ Primer" (For Beginners)!!!

    再看到给初学C++的人推荐C++ Primer的我就要揍人了,真的! 被他妈这帮装逼犯给误导了,耽误了无数的功夫! 就是听这帮傻逼的谣言,说C++ Primer讲解更深入什么的,初学也应该啃这本书,老 ...

  3. QT_study

    https://blog.csdn.net/a313827758/article/details/72736552 https://blog.csdn.net/xbcreal/article/deta ...

  4. 【OpenCV】 在CentOS下搭建OpenCV开发环境

    最近开始入模式识别的坑,自然被迫上OpenCV了. 在多次尝试给VS2015扩展Windows 10 SDK无果后(不要问我为啥..VS2015开发C++的标准库全给扔到这个SDK里了,打包在VS安装 ...

  5. Entity Framework Code First (五)Fluent API - 配置关系 转载 https://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html

    上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...

  6. 16/7/9_Bootstrap-设计原则

    移动优先: •  在设计的初期就要考虑页面如何在多终端展示 渐进增强: •  充分发挥硬件设备的最大功能

  7. org.dom4j 解析XML

    org.dom4j 解析xml java 代码 1 import java.io.File; import java.io.FileOutputStream; import java.io.FileW ...

  8. (三)Schema与数据类型优化

    1.Schema schema,中文叫模式,是数据库的组织和结构 2.选择优化的数据类型 更小的通常更好:尽量使用可以正确存储数据的最小数据类型 简单就好:简单数据类型的操作通常需要更少的cpu周期. ...

  9. Spring cloud 注册服务小结

    服务注册中心:Eureka.Zookeeper.Cousul.Nacos 使用RestTemplate.openFeign做服务调用,底层使用的是Ribbon. Ribbon做了负载均衡,也可以做一个 ...

  10. RMQ(连续相同最大值)

    http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submi ...