白话Redux工作原理。浅显易懂。
如有纰漏或疑问,欢迎交流。
Redux 约法三章
唯一数据源(state)
虽然redux
中的state
与react
没有联系,但可以简单理解为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(数据流):
- UI发出动作,如click, submit;
- action, 描述发生了什么;
- reducer处理发生的事情,生成新state;
- store被更新;
- UI响应store更新
- ...
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提供了一下方法:
-
store.getState()
获取当前state -
store.dispatch(action)
更新state -
store.subscribe(listener)
store更新后回调listener,回调函数里面可以调用store.getStore()来获取更新后得state哟~ - 取消listener的方式比较特别:再调用一次
store.subscribe(sameListner)
ps: 如有纰漏或疑问,欢迎交流。
先写这么多,有时间继续更新。
十分钟理解Redux核心思想,过目不忘。的更多相关文章
-
后端技术杂谈11:十分钟理解Kubernetes核心概念
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 本文转自 https://github.com/h2pl/Java-Tutorial 喜欢的 ...
-
十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
-
十分钟理解JavaScript引擎的执行机制
关注专栏写文章 十分钟理解JavaScript引擎的执行机制 方伟景 千锋前端开发推动市场提升的学习研究者. 4 人赞同了该文章 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS ...
-
十分钟理解Gradle
一.什么是Gradle 简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译.打包等过程.我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建ap ...
-
十分钟理解Actor模式
Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing.所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor.共享内存更适合单 ...
-
Vuejs核心思想学习笔记
习Vue已经有一段时间了,但未对其核心思想作自己的总结和理解 Vue核心思想有两个 : 数据驱动和组件化(系统组件) 数据驱动 数据驱动目的是让数据和DOM保持同步, 只要修改了data数据,DOM就 ...
-
《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
-
《深入理解Spark:核心思想与源码分析》一书正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
-
《深入理解Spark:核心思想与源码分析》正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
随机推荐
-
requireJs和r.js压缩工具
上面release是执行命令 node r.js -o build.js 生成的,需要切换到目录require/tools下面,也就是 有r.js和build.js的目录,才能执行命令 代码目录如上: ...
-
Function, Predicate
Function, Predicate的使用 Function用于把一种类型的对象转化为另一种类型的对象.Predicate用于判断某个对象是否符合一定条件. 一.Function和Functions ...
-
ajax,json和$.each()
json返回的时候,只需要展示部分字段,如果是 ajax从后台获取结果处理,可以使用.select() 等处理结合匿名类,生成需要的字段的匿名类json字符串,返回前端,可以使用$.parseJson ...
-
Swift - 经纬度位置坐标与真实地理位置相互转化
通过CoreLocation类,得到的定位信息都是以经度和纬度等表示的地理信息,通过CLGeocoder类可以将其反编码成一个地址.反之,也可根据一个地址获取经纬度. 1,通过经纬度获取地址 1 2 ...
-
.net 2.0 后台多线程
System.Threading.Thread thread1 = new System.Threading.Thread(delegate() { Web.BLL.banpaiconfig.Vide ...
-
Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError
解决Android studio中找不到so文件的问题:java.lang.UnsatisfiedLinkError 表示我们不编译jni代码,直接从libs里面复制so库 文件路径:app\buil ...
-
【转】Android-Input Getevent
https://source.android.com/devices/input/getevent Getevent getevent 工具可在设备上运行,并可提供关于输入设备和内核输入事件的实时转储 ...
-
彻底弄懂 HTTP 缓存机制及原理 | 干货
来源:www.cnblogs.com/chenqf/p/6386163.html 前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个 ...
-
C# dns.gethostentry()获取失败,提示不存在主机
传入参数domain有误. 如果是域名,可以解析.如果是局域ip可以解析. 如果是外网,解析不成功. 解决方法: 判断传入参数是域名还是ip,如果是域名,则使用dns.gethostentry(dom ...
-
asp.net网站,在没有项目源码情况下的扩展
如果在没有源码的情况下,要扩展asp.net网站,可以自己新增一个类库项目,在里面添加需要扩展的类,代码如下: using System; using System.Collections.Gener ...