redux
一、什么是redux
Redux 是 JavaScript 状态容器,提供可预测化的状态管理。可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。Redux 除了和 React 一起用外,还支持其它界面库。 它体小精悍(只有2kB,包括依赖)。
二、学习网址:
http://www.redux.org.cn/ 中文网址 http://redux.js.org/ 英文网址
三、安装与引入
npm install --save redux
安装
import { createStore } from 'redux';
引入
四、redux三大原则
单一数据源、state是只读的,使用纯函数来执行修改
五、使用redux
当安装好redux包并引入以后,我们通过creteStore(reducer)创建一个store状态机,用于状态管理。reducer是一个纯函数【纯函数即返回值只有传入的参数决定】,reducer(state,action)有2个参数,state为当前的状态,action 就是一个描述“发生了什么”的普通对象,reducer中通过switch流程控制语句判断action.type的值,来更改state。通过使用store.dispatch(action)来触发aciton的改变,然后通过store.subscribe(()=>{}),来手动订阅更新,当store.dispatch(action)后,就会触发store.subscribe。通过使用store.getState()获取当前store中state状态
import{ render } from 'react-dom';
import { createStore } from 'redux';
/**
* 这是一个 reducer,形式为 (state, action) => state 的纯函数。
* 描述了 action 如何把 state 转变成下一个 state。
*
* state 的形式取决于你,可以是基本类型、数组、对象、
* 甚至是 Immutable.js 生成的数据结构。惟一的要点是
* 当 state 变化时需要返回全新的对象,而不是修改传入的参数。
*
* 下面例子使用 `switch` 语句和字符串来做判断,但你可以写帮助类(helper)
* 根据不同的约定(如方法映射)来判断,只要适用你的项目即可。
*/
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
// 创建 Redux store 来存放应用的状态。
// API 是 { subscribe, dispatch, getState }。
let store = createStore(counter);
// 可以手动订阅更新,也可以事件绑定到视图层。
store.subscribe(() =>
console.log(store.getState())
);
// 改变内部 state 惟一方法是 dispatch 一个 action。
// action 可以被序列化,用日记记录和储存下来,后期还可以以回放的方式执行
store.dispatch({ type: 'INCREMENT' });
// 1
store.dispatch({ type: 'INCREMENT' });
// 2
store.dispatch({ type: 'DECREMENT' });
// 1
render(
//这里我们通过将store传入组件,后续我们即可以通过this.props.store来调用store
<Counter store={store} />,
document.querySelector('#root')
)
六、redux中的一些处理
- action有可能需要多次调用,为了避免书写麻烦,我们用一个方法来创建并返回一个action,action必须是一个对象,这个方法官方的叫法是actionCreator。 在redux里要更改数据,必须通过reducer来更改,触发reducer的惟一方式是dispatch一个action, 只要dispatch了action,所对应的reducer就会执行,reducer执行之后,state就发生了改变
const add = (num = 1) => {
return {
type: 'ADD',
num
}
}
const reduce = (num = 1) => {
return {
type: 'REDUCE',
num
}
}
store.dispatch(add(5))
store.dispatch(reduce(2))
在处理action:type时,如果type值我们写错了,redux也不会报错,他会执行default默认值,这时我们就很尴尬了,所以我们常用的办法时,在action文件夹里创建一个actionType文件,将所有action里要用到的type值,用变量存起来,变量值为字符串即下面的做法,后面我们将type类型用变量引入,加入不存在这个变量的话,就会出现undefined报错
// 定义action的类型
export const ADD = 'ADD';
export const REDUCE = 'REDUCE';
export const START_GET_DATA = 'START_GET_DATA';
export const GET_DATA_SUCCESS = 'GET_DATA_SUCCESS';
// 导入actionType
import {
ADD,
REDUCE,
START_GET_DATA,
GET_DATA_SUCCESS
} from './actionType';
// ·加· 这个动作的action creator,
export const add = (num = 1) => {
return {
type: ADD,
num
}
}
- 一个store里面不只一个reducer,可能有很多个reducer,这时我们可以把reducer提到一个文件夹单独编写,将每一个reducer的名字取为文件名,然后暴露出去,在从index.js文件里使用redux中combineReducers将所有reducer暴露出去
reducers
import {
combineReducers
} from 'redux';
import cart from './cart';
// combineReducers 是redux提供的一个方法,用于合并多个reducer
export default combineReducers({
cart
})
combineReducers使用示例
- [linux][kernel]dump kmsg到文件系统中
- [接口测试 - 基础篇] 12 还是要掌握python日志管理模块的
- Spring整合Quartz分布式调度
- [接口测试 - 基础篇] 11 掌握下python解析YAML格式也是需要的
- 如何用Python创建眼下火爆的区块链?这篇干货请收藏
- [接口测试 - 基础篇] 10 别啊,还有INI格式呢,别忘记我
- [接口测试 - 基础篇] 09 其实吧,读写csv格式也是要掌握的
- 【源码分享】机器学习之Python支持向量机
- [接口测试 - 基础篇] 08 封装个基本的excel解析类
- 关关的刷题日记10——Leetcode 1. Two Sum 方法1
- BZOJ 2463: [中山市选2009]谁能赢呢?(新生必做的水题)
- 10个Python面试常问的问题
- 关关的刷题日记11——Leetcode 1. Two Sum 方法2、3
- 计蒜客:百度的科学计算器(简单)【python神解】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法