Redux的基本原则

  • 唯一数据源(应用的状态数据应该只存储在唯一的一个store上);
  • 保持状态只读(不能直接修改Store的状态,而是应该通过派发一个action对象来完成)
  • 数据改变只能通过纯函数完成(函数的返回结果必须完全由参数state和action决定)

Action

Action是store数据的唯一来源。需使用store.dispatch()将所需的action传到store。Action是把服务器响应的数据或者用户输入的数据、和其他一些非View的数据传入store的有效载荷。Action实际上是JS的普通对象。示例:


type:"ADD_TODO", //type为必须的字段,值为字符串或存放字符串的变量
text:"我是示例"

  

需要注意的是:应该尽可能的减少在action中传递的数据。

Action创建函数

Action创建函数只是简单的返回一个action。示例:

function addTodo(text) {
return {
type: ADD_TODO,
text
}
}

  

Redux提供的bindActionCreators()可以自动把多个action创建函数绑定到dispatch()方法上。

Reducer

Reducers 指定了应用状态的变化如何响应 actions 并发送到 store 的,记住 actions 只是描述了有事情发生了这一事实,并没有描述应用如何更新 state。

reducer 就是一个纯函数,接收旧的 state 和 action,返回新的 state。

(previousState, action) => newState

  

永远不要在reducer里做这些操作:

  • 修改传入参数;
  • 执行有副作用的操作,如API请求和路由跳转;
  • 调用非纯函数,如Data.now()或Math.random();

reducer一定要保持纯净。只要传入参数相同,返回计算得到的下一个state就一定相同。没有特殊情况、没有副作用、没有API请求、没有变量修改,单纯执行计算

combinerReducers()方法只是生成一个函数,这个函数用来调用你的一系列reducer,每个reducer根据他们的key来筛选出state中的一部分数据并处理,然后这个生成的函数再将所有reducer的结果合成一个大的对象。
//ES6的写法
import { combineReducers } from 'redux'
import * as reducers from './reducers' const todoApp = combineReducers(reducers)

Store

Store的职责:

  • 维持应用的state;
  • 提供 getState() 方法来获取state;
  • 提供 dispatch(action) 方法更新state;
  • 通过 subscribe(listener) 注册监听器;
  • 通过 subscribe(listener) 返回的函数注销监听器;

Redux 应用只有一个单一的 store

store的使用示例:

//创建store
let store = createStore(todoApp);
//打印初始状态
console.log("初始状态======》",store.getState()); //每次state更新时,打印日志
//注意subscribe()返回一个函数用来注销监听器
const unsubscribe = store.subscribe(()=>console.log("state有更新=======》",store.getState())) //发起一系列action
store.dispatch(addTodo("learn about actions"));
store.dispatch(addTodo("learn about reducers"));
store.dispatch(addTodo("learn about store"));
store.dispatch(toggleTdo(0));
store.dispatch(toggleTdo(1));
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED)); //停止监听
unsubscribe();

数据流

Redux应用中数据的生命周期遵循4个步骤:

  1. 调用  store.dispatch(action) 。 action 就是一个描述“发生了什么”的普遍对象,可将其理解为通过 store.dispatch 来告诉reducer发生了什么
  2. Redux store调用传入的reducer函数。根据传入的action.type来更新state
  3. 根reducer应该把多个子reducer输出合并成一个单一的state树。可使用原生的 combineReducers() 辅助函数,也可自己实现
  4. Redux store保存了根reducer返回的完整的state树

React-Redux

connect():生成容器组件;

mapStateToProps():指定如何把当前Redux Store state映射到展示组件的props中。示例:

//VisibleTodoList 需要计算传到 TodoList 中的 todos,
//所以定义了根据 state.visibilityFilter 来过滤 state.todos 的方法,并在 mapStateToProps 中使用 const getVisibleTodos = (todos, filter) => {
switch (filter) {
case 'SHOW_COMPLETED':
return todos.filter(t => t.completed)
case 'SHOW_ACTIVE':
return todos.filter(t => !t.completed)
case 'SHOW_ALL':
default:
return todos
}
} const mapStateToProps = state => {
return {
todos: getVisibleTodos(state.todos, state.visibilityFilter)
}
}

  

mapDispatchToProps():接受dispatch()方法并返回期望注入到展示组件的props中的回调方法。示例:

//VisibleTodoList 向 TodoList 组件中注入一个叫 onTodoClick 的 props ,
//并且onTodoClick 能分发 TOGGLE_TODO 这个 action const mapDispatchToProps = dispatch => {
return {
onTodoClick: id => {
dispatch(toggleTodo(id))
}
}
}

Redux的整体流程:

  1. 将action传入dispatch()来触发reducer
  2. reducer响应action,并根据action.type来处理旧的state数据,然后返回新的state数据,将新的state数据发送到store
  3. store保存reducer返回的新的state,然后所有订阅  store.subscribe(listener)  的监听器都将被调用,以此来创建容器组件.(在react-redux中我们使用connect()方法来生成,所以不用手写 store.subscribe()  来生成容器组件)

Redux学习笔记-----基础部分的更多相关文章

  1. Redux学习笔记-基础知识

      Redux概述 是什么:Redux是管理状态的容器,提供可预测的状态管理. 怎么做:Redux主要是用来管理组件或者应用的状态,本质上跟一个事件处理器差不多.通过分发action触发reduce来 ...

  2. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  3. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  4. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  5. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  6. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...

  7. React Redux学习笔记

    React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...

  8. Java学习笔记——基础篇

    Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...

  9. iOS学习笔记——基础控件(上)

    本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...

随机推荐

  1. window 常用MySQL数据库命令总结

    登录:cmd - mysql -uroot -p 创建数据库:CREATE DATABASE `tpcms` DEFAULT CHARACTER SET utf8 COLLATE utf8_gener ...

  2. C#简单实现读取txt文本文件并分页存储到数组

    最近做一个VR项目,需要把某个中草药的介绍信息分页显示到unity场景里然后用VR手柄切换信息. unity的脚本是c#,就先在本地写了个代码测试了一下,利用控制台测试输出,到时候拷贝函数过去再结合交 ...

  3. vbScript: 编号成生不夠位數前面加零

    '编号成生Geovin Du '不夠位數前面加零 塗聚文 Function getStringlen(str,lenint) so="" itop=0 slen=Len(str) ...

  4. jsonp跨域&百度下拉

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. jQuery可调整表和列宽插件-colResizable

    最基本的例子 引入JS <script src="js/jquery-1.8.0.min.js" type="text/javascript">&l ...

  6. .NET开源工作流RoadFlow-流程运行-菜单配置

    经过流程设计和表单设计后,一个流程就设置完成了,下面说说怎么让设计好的流程运行起来吧. 流程和表单设计完成发布后都在应用程序库里,我们只要将流程在角色应用中配置给相应的用户即可让流程选择了. 在系统管 ...

  7. 使用版本 1.0.0 的 Azure ARM SDK for Java 创建虚拟机时报错

    问题描述 我们可以通过使用 Azure ARM SDK 来管理 Azure 上的资源,因此我们也可以通过 SDK 来创建 ARM 类型的虚拟机,当我们使用 1.0.0 版本的 Azure SDK fo ...

  8. 使用sqlloader向oracle导入文本数据

    文本文件如下,注意文件名必须有后缀,文本行首也需要|分隔符:[oracle@ycr test]$ more person.txt|aaa|123|m|aaa|123|m|aaa|123|m|aaa|1 ...

  9. 使用Gardener在Google Cloud Platform上创建Kubernetes集群

    Gardener是一个开源项目,github地址: https://github.com/gardener/gardener/ 使用Gardener,我们可以在几分钟之内在GCP, AWS, Azur ...

  10. python入门17 类和对象

    类:一类事物的抽象化.概念: 类的变量(属于类的变量,定义在类的开始处)  成员变量(self.变量) 类的方法( @classmethod,cls参数)   成员方法( self参数 )  静态方法 ...