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. AngularJS-自定义过滤器 ng-repeat 求和

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

  2. 面试基础(二)-mem函数

    常考的函数有下面三个,memset,memcpy,memmove,一定要记住三个函数的函数原型,熟记返回值类型和参数类型,当然也不能忘记参数检查   memset #include<iostre ...

  3. php自建静态博客步骤

    进入博客目录新建index.php页面 <?php require “XXXX/index.html”;//引入html页面 是否能进入localhost/xxx/index.php 注意,ph ...

  4. jQuery动态添加删除CSS样式

    jQuery框架提供了两个CSS样式操作方法,一个是追加样式addClass,一个是移除样式removeClass,下面通过一个小例子讲解用法. jQuery动态追加移除CSS样式 <!DOCT ...

  5. myeclipse 2014 闪退问题解决

    1.删掉Workspace下面的  \.metadata\.plugins\org.eclipse.core.resources一整个文件夹 2.删掉Workspace 下面的 \.metadata\ ...

  6. SpringBoot-mvn插件

    在maven projects中有一组springboot的插件 六个选择: 0.build-info:Generate a build-info.properties file based the ...

  7. python 日期排序

    转自:http://www.cnblogs.com/lkprof/p/3179850.html,感谢分享~ 问题1:如果日期中有千年以前的情况(没法用格式化函数),如('2010-11-23','19 ...

  8. 在浏览器的市场上,IE依然是放弃了,firefox还在继续~~

    自从微软失败后,发布了Edge:但是依然是没有多少市场的,毕竟各种难受: 单从开发者工具,我是没有其它选择了, ie的不能用,https://www.microsoft.com/en-us/welco ...

  9. DataBase Migration 使用笔记

    Add-Migration 新建数据库迁移版本 Update-Database -Verbose 更新到数据库(-Verbose 显示详细信息) Update-Database –TargetMigr ...

  10. 【Hibernate那点事儿】—— Hibernate知识总结

    前言: 上一篇简单的讲解了下Hibernate的基础知识.这里对Hibernate比较重要的一些知识点,进行总结和归纳. 手码不易,转载请注明!——xingoo 总结的知识点: 1 关于hiberna ...