初识Redux

简书 i蒹葭从风
转载请注明原创出处,谢谢!
如果读完觉得有收获的话,欢迎点赞加关注

简单介绍一下redux 的一些术语和基本概念。 action,reducer,state,store。主要是这4个术语。下面依次来说说这些概念。

action

action 本质上是javascript 的普通对象。约定action内使用一个字符串类型的type字段来表示将要执行的动作。很多情况下,type将会定义成字符串常量。例如:const INCREMENT = 'INCREMENT',另外,当应用项目很大的时候,建议使用单独的模块或文件来存放action。除了type字段以外,action 对象的结构完全有开发者自己决定。

reducer

reducer 是个形式为(state, action) => state 的纯函数 ,描述了action 如何把state 转变成下一个state。

Reducer 这个名称来源于Array.prototype.reduce中的第一个参数,reducer 。reducer 是一个累加器函数,它的参数是上个累加值和数组当前元素,然后通过计算返回本次的累加值。在redux中,state 就是那个累加值,action 就是数组当前的元素。reduce 以及map filter 等方法是函数式编程中十分常用的数组处理方法。

state 的形式取决于开发者项目的需要,可是是基本类型,数组,是对象,甚至是immutable.js 生成的数据结构。唯一的点是当state 变化时需要返回全新的对象,而不是修改传入的参数。reducer 要用纯函数。那么什么是纯函数。

纯函数

纯函数 pure function 是这样一种函数,输入输出数据流全是显式的,显式的意思是,函数与外界交换数据只有一个唯一的渠道,参数和返回值。函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过函数返回值传递到该函数外部。
纯函数不能访问外部变量,它能接触的外部参数只有来自外部的参数。纯函数不能修改参数,因为这样做可能会把一些信息通过输入参数夹带到外界。
reducer 就是这样的纯函数,永远不要在reducer 里做一下操作:

  1. 修改传入的参数
  2. 执行有副作用的操作,比如:请求API和路由跳转
  3. 调用非纯函数,如 new Data.now(),Math.random()

函数副作用会给应用带来不可预测的麻烦,产生难以预测的效果。严格的函数式语言要求函数必须无副作用。

不能修改参数 state

当state 是对象时,修改参数state会影响程序的变更追踪。如果你在项目里使用了react-redux 将redux 程序连接上了UI 组件上,那么你的组件将不能更新,因为react-redux 无法察觉到任何state变化。为什么会发生这样的事情?因为在javascript 上,对象是引用类型,当你改变了参数state 变化前后的state 将会指向同一个内存地址,react-redux 就会以为这是两个相同的state,而不会进行渲染。

store

store 是个全局对象,将action 和reducer 以及state 联系在一起。Store 有一下职能:
维持应用的state
提供getState 方法获取state
提供dispatch 方法更新state
通过subscribe (listener)注册监听器

创建store需要从redux 包中导入createStore 这个方法。
import {createStore} from 'redux'
使用reducer 纯函数作为第一个参数创建store
let store = createStore(reducer)
还可以添加第二个参数,作为初始化state

获取和监听

创建完store 使用它获取数据,并监听变化

const store = createStore(reducer);
let currentValue = store.getState();
store.subscribe(()=>{
    const previousValue = currentValue;
    currentValue = store.getState();
    console.log(previousValue, currentValue)
})

以上代码做了这样几件事:

  1. 获取初始化state和currentValue
  2. 使用store.subscribe()方法监听变化
  3. 在store.subscribe的回调函数中,将currentValue 传递给previousValue 作为先前的state
  4. 获取更新后的state 到curentValue 作为当前的state
  5. 打印变化前后的state

发起action

Store 使用dispatch(action)方法发起action,更新state
当发起action后,就将action 穿进了store中,使用reducer 纯函数继续执行更新。改变内部state 唯一方法是dispatch 一个action。这样确保了视图和网络请求都不能直接修改state,相反它们只能表达想要修改state的意图,也就是dispatch 一个action。

总结

  1. action 是个javascript 对象,包含一个type 字段的javascript 对象,它是store 数据的唯一来源。
  2. reducer 是一个纯函数,不要在reducer 中做这些事情,修改传入参数state,执行有副作用的操作,调用非穿函数
  3. store 负责更新,查询,订阅state 等多个工作。store 是全局唯一的,它将action,reducer,state联系在一起。

如果读完觉得有收获的话,欢迎点赞加关注
您的认可是我写作的最大动力

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 前言 本文 有配套视频,可以酌情观看。 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论。 文中所有内...
    珍此良辰阅读 11,892评论 23 111
  • 学习必备要点: 首先弄明白,Redux在使用React开发应用时,起到什么作用——状态集中管理 弄清楚Redux是...
    贺贺v5阅读 8,877评论 9 58
  • Redux的基本元素组成 Action本质上就是普通的JavaScript对象。我们约定,action内使用一个字...
    sdcV阅读 228评论 0 1
  • 一、什么情况需要redux? 1、用户的使用方式复杂 2、不同身份的用户有不同的使用方式(比如普通用户和管...
    初晨的笔记阅读 2,013评论 0 11
  • 一、CMS管理系统功能 CMS是ContentManagementSystem的缩写,意为"内容管理系统"。 CM...
    默默先生Alec阅读 5,319评论 0 7