先看例子

其实,redux的核心概念就是storeactionreducer,从调用关系来看如下所示

store.dispatch(action) --> reducer(state, action) --> final state

可以先看下面的极简例子有个感性的认识,下面会对三者的关系进行简单介绍

// reducer方法, 传入的参数有两个
// state: 当前的state
// action: 当前触发的行为, {type: 'xx'}
// 返回值: 新的state
var reducer = function(state, action){switch (action.type) {case 'add_todo':return state.concat(action.text);default:return state;}
};// 创建store, 传入两个参数
// 参数1: reducer 用来修改state
// 参数2(可选): [], 默认的state值,如果不传, 则为undefined
var store = redux.createStore(reducer, []);// 通过 store.getState() 可以获取当前store的状态(state)
// 默认的值是 createStore 传入的第二个参数
console.log('state is: ' + store.getState());  // state is:// 通过 store.dispatch(action) 来达到修改 state 的目的
// 注意: 在redux里,唯一能够修改state的方法,就是通过 store.dispatch(action)
store.dispatch({type: 'add_todo', text: '读书'});
// 打印出修改后的state
console.log('state is: ' + store.getState());  // state is: 读书store.dispatch({type: 'add_todo', text: '写作'});
console.log('state is: ' + store.getState());  // state is: 读书,写作

store、reducer、action关联

可以结合上面的代码来看下面几段解释

  1. store:对flux有了解的同学应该有所了解,store在这里代表的是数据模型,内部维护了一个state变量,用例描述应用的状态。store有两个核心方法,分别是getStatedispatch。前者用来获取store的状态(state),后者用来修改store的状态。

    // 创建store, 传入两个参数
    // 参数1: reducer 用来修改state
    // 参数2(可选): [], 默认的state值,如果不传, 则为undefined
    var store = redux.createStore(reducer, []);// 通过 store.getState() 可以获取当前store的状态(state)
    // 默认的值是 createStore 传入的第二个参数
    console.log('state is: ' + store.getState());  // state is:// 通过 store.dispatch(action) 来达到修改 state 的目的
    // 注意: 在redux里,唯一能够修改state的方法,就是通过 store.dispatch(action)
    store.dispatch({type: 'add_todo', text: '读书'});
  2. action:对行为(如用户行为)的抽象,在redux里是一个普通的js对象。redux对action的约定比较弱,除了一点,action必须有一个type字段来标识这个行为的类型。所以,下面的都是合法的action

    {type:'add_todo', text:'读书'}
    {type:'add_todo', text:'写作'}
    {type:'add_todo', text:'睡觉', time:'晚上'}
  3. reducer:一个普通的函数,用来修改store的状态。传入两个参数 state、action。其中,state为当前的状态(可通过store.getState()获得),而action为当前触发的行为(通过store.dispatch(action)调用触发)。reducer(state, action) 返回的值,就是store最新的state值。

    // reducer方法, 传入的参数有两个
    // state: 当前的state
    // action: 当前触发的行为, {type: 'xx'}
    // 返回值: 新的state
    var reducer = function(state, action){switch (action.type) {case 'add_todo':return state.concat(action.text);default:return state;}
    };

关于actionAreator

看到xxCreator总能让人联想到工厂模式,没错,在redux里,actionAreator其实就是action的工厂方法,可以参考下面例子。

actionCreator(args) => action

var addTodo = function(text){return {type: 'add_todo',text: text};
};addTodo('睡觉');  // 返回:{type: 'add_todo', text: '睡觉'}

在redux里,actionAreator并非是必需的。不过建议用actionAreator代替普通action对象的直接传递。除了能够减少代码量,还可以大大提高代码的可维护性。想象下面的场景再来看回文章开头的例子,应用actionAreator后的代码示例。

store.dispatch(addTodo('睡觉'));
console.log('state is: ' + store.getState());  // state is: 读书,写作,睡觉

相关链接

  • redux中文文档:http://camsong.github.io/redu...
  • redux英文文档:http://redux.js.org/index.html
  • redux源码解读:https://github.com/chyingp/re...

Redux系列01:从一个简单例子了解action、store、reducer相关推荐

  1. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  2. SAP MM采购定价过程的一个简单例子

    SAP MM采购定价过程的一个简单例子 本文以一个简单的例子阐述了SAP MM模块中采购定价的基本原理.本例中,假定采购订单里输入的是含税采购价,然后系统自动计算出物料最终的采购价格(含税价-税额=采 ...

  3. WF4.0入门系列1——创建一个简单的工作流

    WF4.0入门系列1--创建一个简单的工作流 打开VS2010,选择文件-新建-项目,选择Workflow项 工作流台应用程序,在名称处输入chapter01,选择合适的位置,这里默认,单击确定. V ...

  4. KaTex的一个简单例子

    在网页中可以用KaTex显示数学公式,KaTex官网是https://katex.org 以下是KaTex的一个简单例子: 下载https://github.com/KaTeX/KaTeX/archi ...

  5. 单纯形法之人工变量法求解步骤:一个简单例子

    文章目录 人工变量法 1. 大M法 1.1. 题目 1.2. 转化为标准型 1.3. 添加人工变量 2. 两阶段法 2.1. 步骤 2.2. 题目 2.2.1. 转化为标准型 2.2.2. 添加人工变 ...

  6. 初次使用CTex时的一个简单例子

    初次使用CTex时的一个简单例子 1.初次使用Ctex时的例子 第一次使用 LATEX,在WinEdt编辑以下代码,然后使用PDFLaTeX生成PDF文档. \documentclass{articl ...

  7. 协方差检验用在什么地方_通过一个简单例子,通俗讲下协方差分析

    内容来自:"小白学统计"微信公众号,感谢作者授权. 临床中经常碰到这种设计:研究对象分为两组,接受不同治疗(如治疗组和安慰组),每组分别在治疗前和治疗后测量观察指标(如血压值).目 ...

  8. 什么是量子计算机?用一个简单例子来解释

    译者:王亮  作者:YK Sugi  原文:http://t.cn/EZAElk0 Hi,大家好! 不久前,我参观了加拿大温哥华的D-Wave Systems公司,这是一家制造前沿量子计算机的公司. ...

  9. 贝叶斯模型的一个简单例子及python实现

    目录 1. 前言 2. 问题描述 3. 贝叶斯定理 4. Bayes engine: scalar implementation 5. Bayes engine: vectorization 6. 测 ...

最新文章

  1. TVM适配NN编译Compiler缺陷
  2. UI组件之TextView及其子类(二)RadioButton和CheckBox
  3. IE6中png背景图片透明的最好处理方法
  4. javamail实现邮箱验证功能
  5. fastdfs删除过期文件_Spring Boot 系列:使用 Spring Boot 集成 FastDFS
  6. 【原创】.NET Core应用类型(Portable apps Self-contained apps)
  7. 妙用VM的“远程显示”功能
  8. 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值
  9. Appcan性能低?速度慢?UI难看?与apicloud用数据说话
  10. 基于RV1126平台imx291分析 --- media注册
  11. Hinton的GLOM模型与千脑理论有何本质不同?
  12. 一份spyglass做lint的lint.prj
  13. 获取Map的key值的几种方式
  14. 2022-2028全球与中国制粒机市场现状及未来发展趋势
  15. scapy python_Python中使用Scapy小记
  16. 学IT,看教程,看视频,你必须知道的学习网站
  17. 使用D435i相机跑ORB-SLAM2_RGBD_DENSE_MAP-master稠密建图编译(实时彩色点云地图加回环+保存点云地图)
  18. Oracle 数据库创建数据库和表
  19. 人生之路 — 切勿迷失自我
  20. dpo指标详解买入绝技_雷霆一击战法买入及卖出方法的相关介绍

热门文章

  1. 如何毕业后继续白嫖知网
  2. JavaSE(二十六)——多线程之模拟龟兔赛跑
  3. 激光SLAM学习--移动机器人技术系列课(智东西)
  4. mastercam2019安装教程
  5. 人工智能 | 自然语言处理(NLP)研究团队
  6. 新手小白零基础搭建个人博客(三)部署篇
  7. sublime配置python3环境_【env】Sublime配置Python3开发环境
  8. 用MsgWaitForMultipleObjects代替WaitForSingleObject和WaitForMultipleObjects()
  9. 升序排列python_Python3基础 sort 将一个列表中的值升序排列
  10. 凉凉用计算机打的歌谱,张碧晨杨宗纬《凉凉》歌谱