前言

Redux 试图让 state 的变化变得可预测

react/react-native 将组件的更新交给了状态机(state),想要更新页面活着页面的某个组件就必须得通过改变state的方式。页面越复杂,组件越多,所需要的state就越多,并且随着页面的交互,state也需要不断得变化,而管理这些不断变化的 state 就变的非常困难。终有一刻,不计其数的 state 会让你觉得 state 的变化已然不受控制。

"如果你不知道是否需要 Redux,那就是不需要它。"

Redux主要作用是让应用的 state 可以集中管理,从而达到清晰管理每个 state,所以当你的应用很简单时,完全不需要使用redux,它会增加你的工作量。

三大原则

Redux 主要是通过限制 state 更新发生的时间和方式来实现 state 的管理。而这些限制条件则反应在三大原则中:

单一数据源

整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。

State 只读

惟一改变 state 的方法就是触发 action。

确保视图和网络请求都不能直接修改 state,它们可以表达想要修改的意图(actio),然后通过这个触发意图(action)来修改 state。

使用纯函数来执行修改

为了描述 action 如何改变 state tree ,你需要编写 reducers。

Reducer 是纯函数,它接收先前的 state 和 action,并返回新的 state。

Action、Reducer 和 Store

Action

action是一个普通对象,用于指明用户的操作行为,它是把数据从应用传到 store 的有效载荷,是 store 数据的唯一来源。通常将新数据(state)传入action发送给store。

const EAT_APPLE = 'EAT_APPLE'

{
type: EAT_APPLE,
text: 'eat an apple'
}

这里定义了一个action对象,它有typetext俩个键,其中type是必需的,用于描述当前action;text是自定义的,作为承载数据的载体。

Action 创建函数

Action创建函数就是生成 action 的方法,,调用这个函数会创建action,通常只返回一个简单的action对象。它的作用主要是为了减少重复大量地创建action。

function eat(text) {
return {
type: EAT_APPLE,
text
}
}

Reducer

reducer根据action操作来做出不同的数据响应,指明应用如何更新 state。它是一个纯函数,只做数据处理。

(previousState, action) => newState

它接收俩个参数:action和state,并return一个新的state。

纯函数(同样的输入,必定得到同样的输出):

  • 修改传入参数;
  • 执行有副作用的操作,如 API 请求和路由跳转;
  • 调用非纯函数,如 Date.now() 或 Math.random()。
 //使用ES6参数默认值语法初始化state
function toEat(state = {behavior: ""}, action) {
if (typeof state === 'EAT_APPLE') {
return Object.assign({}, state,{
behavior: action.text
}}
} return state;
}

注意:

  • 不要修改 state,Object.assign() 新建了一个副本
  • 在无匹配action的情况下返回旧的 state

由于redux单一数据源,所以整个应用只有一个单一的 store,所以当需要拆分数据处理逻辑时,你应该使用 reducer 组合 而不是创建多个 store。

Redux 提供了一个combineReducers方法,用于 Reducer 的合并:

combineReducers({reducer,...})

Store

Redux 应用只有一个单一的 store。

store有以下方法:

  • createStore(reducer,[preloadedState])

    根据传入的reducer创建一个store。这个函数的第二个参数是可选的,用于设置 state 初始状态。

  • store.getState()

    获取当前state的值。

  • store.dispatch(action)

    向store派遣一个action。即向store传值。

  • store.subscribe(listener)

    注册监听器,监听store,一旦store变化,会触发listener。该函数会返回一个函数用于注销该监听器。

工作流程

一个清晰明了的流程图能帮我们更好的理解:

从上图可以看出redux处理的是一个单向数据流:

  • 用户行为或者程序调用 store.dispatch(action),向store派遣action;

  • store在接收到action后,会自动呼起reducer来处理action,并且会传入俩个参数(当前 State 和收到的 Action),这里reducer可以依据数据处理逻辑拆分成多个,但是数据源store只能是一个;

  • combineReducers函数会将多个多个子 reducer 输出合并成一个单一的 state 树

  • 生成新的UI

总结

  1. 并不总是需要redux,如果你的应用没那么复杂,就没必要用它;
  2. redux通过限制数据更新发生的时间和方式来达到管理state的目的;
  3. redux三大原则:单一store、reducer纯函数、state只读
  4. 在 createStore 和 reducer 函数中都可以初始化state。
  5. redux通过dispatch、subscribe、getState实现数据的发送、监听、获取,从而实现单向数据流的流动

redux 初识的更多相关文章

  1. Redux初识

    1.定义规则counter 2.根据计算规则生成store let store=createStore(counter); 3.订阅消息(state 发生变化后发送消息) 4.触发规则,使state发 ...

  2. 初识redux走向redux-react

    废话不多说,先上一张图 首先记住redux设计思想 Web应用是一个转态机,视图与转态是一一对应的 所有的转态,保存在一个对象里 1.store 存储数据的容器,整个应用只有一个state,Redux ...

  3. 初识Redux Middleware

    前言 原先改变store是通过dispatch(action) = > reducer:那Redux的Middleware是什么呢?就是dispatch(action) = > reduc ...

  4. React初识整理(五)--Redux和Flux(解决状态传递问题)

    Flux 1.引入:在React的应⽤中,状态管理是⼀个⾮常重要的⼯作.我们不会直接对DOM节点进⾏操作,⽽是通过将数据设置给state,由state来同步UI,这种⽅式有个潜在的问题,每个组件都有独 ...

  5. Redux教程2:链接React

    通过前面的教程,我们有了简单的环境,并且可以运行Redux的程序,也对 如何编写Redux示例 有了初步的印象: 掌握了 使用Redux控制状态转移 ,继而驱动 React 组件发生改变,这才是学习R ...

  6. 《React与Redux开发实例精解》读书笔记

    第五章 JSX语法 class属性改为className for属性改为htmlFor jsx中javascript表达式必须要有返回值,使用三元操作符 所有的标签必须闭合 input img等 re ...

  7. Redux的核心概念,实现代码与应用示例

    Redux是一种JavaScript的状态管理容器,是一个独立的状态管理库,可配合其它框架使用,比如React.引入Redux主要为了使JavaScript中数据管理的方便,易追踪,避免在大型的Jav ...

  8. Dva框架从初识到上手

    引言 最近工作需要用dva框架,同事帮我培训了一下,有一点点认识,在此总结. 当然,以后对dva可能会了解更透彻,文章会不断更新的.   初识 开始看架构代码,没有看文档的时候,不知道里面的几个关键字 ...

  9. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

随机推荐

  1. driver_register()函数解析

    driver_register()函数解析 /** * driver_register - register driver with bus * @drv: driver to register *  ...

  2. bzoj2599

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 2476  Solved: 733[Submit][Status ...

  3. ASP.NET MVC TempData使用心得

    说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...

  4. 阿里云上给的防止跨站和xss攻击的代码

    文档说明: 1.将waf.php传到要包含的文件的目录 2.在页面中加入防护,有两种做法,根据情况二选一即可: a).在所需要防护的页面加入代码require_once('waf.php');就可以做 ...

  5. jQuery学习笔记之jQuery.fn.init()的参数分析

    这篇文章主要介绍了jQuery.fn.init()的参数分析,需要的朋友可以参考下   从return new jQuery.fn.init( selector, context, rootjQuer ...

  6. IIS HTTP重定向到HTTPS

    最近客户一个网站升级至HTTPS协议访问,但是为了用户输入,客户要求当用户输入的是HTTP协议时,能自动定向到HTTPS,类似百度网站,当你输入www.baidu.com并回车后,地址栏自动变成了ht ...

  7. IIS 启用w3wp.exe调试 没有找到w3wp进程

    必须条件: 在进程列表的下面,有个show processes in all sessions,把它勾上就能看到了 . VS中附加进程的方式调试IIS页面,以及设置断点无效问题解决 以前调试网站的时候 ...

  8. C++中定义使用受限的类

    1.只能在堆上使用的类 栈上对象通过自动调用析构函数释放空间,将该类的析构函数定义为private就可以阻止其被自动调用,从而阻止在栈上使用该类的对象,为了避免资源泄漏问题,在堆上使用该类的对象时我们 ...

  9. .NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)

    一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC ...

  10. react native ios打包到真机

    每当在模拟器上完成了开发,都想到真机上秀秀,正好前段时候买了一个mac,哈哈有机会了.前篇文章以android为例,这里就以ios为例,讲一下打包到iphone真机的流程. 一.前置 1.首先你得有一 ...