redux 是一个状态管理的库。

redux认为页面所有的变化,都是基于状态的改变触发的,所以我们维护一个应用的时候,都是在维护这些状态。而 redux 就是为了维护状态而生的。

API

  • createStore( reducer, [initialState], enhancer ) 函数:

    创建应用的数据 store (一个对象,包含了应用所有的状态),一个应用只能有一个store。

createStore参数

reducer: 一个纯函数,接收两个参数,分别是当前的state 和 action,(action就是一个指令,用来告诉redux改修什么状态) , reducer的返回值必须是新的state。

[initialState] (any): 初始时的 state 。

enhancer : 增强器。也就是中间件,可以改变,redux规定的一些接口类型。

createStore返回值

保存了应用所有 state 的对象。改变 state 的惟一方法是 通过 dispatch 发起action,redux会执行对应state更新函数。subscribe( fn ) 监听器可以监听state的变化,执行传入的函数。

import { createStore } from 'redux'

// reducer 函数
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
// 数据变化后返回的必须是一份新的数据,而不能在原来的数据上修改
return state.concat([ action.text ])
default:
return state
}
} // createStore 函数 ,接收reducer 和 初始state
let store = createStore(todos, [ '小明' ]) // dispatch 发起 action,在这里,action还附带了一个 text 的数据给reducer
store.dispatch({
type: 'ADD_TODO',
text: '小李'
}) //监听器,state更新时,就会触发。
store.subscribe(()=>console.log("数据更新啦")); // store.getState 可以获取到最新的state。
console.log(store.getState()) // ["小明","小李"]
  • combineReducers( reducers )

    用来对复杂应用的 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分。

    合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。
combineReducers({
todos: myTodosReducer,
counter: myCounterReducer
})

参数:

reducers (Object): 一个对象,它的值(value) 对应不同的 reducer 函数,这些 reducer 函数后面会被合并成一个

返回值:合并了所有子reducer的reducer函数

子reducer => reducers/todos.js

export default todos( state=[] , action ){
switch (action.type) {
case 'ADD_TODO':
return state.concat([action.text])
default:
return state
}
}

子reducer => reducers/counter.js

export default counter( state = 0 , action ){
switch( action.type ){
case "INCREMENT":
return ++state
case "DECREMENT":
return --state
default:
return state
}
}

用 combineReducers 合并所有子 reducer。

reducers/index.js

import { combineReducers } from 'redux'
import todos from './todos'
import counter from './counter' // 合并并导出reducer
export default combineReducers({
todos,
counter
})

App.js 使用合并后的reducers

import { createStore } from 'redux'
import reducer from './reducers/index' // 创建store时就可以用合并后的reducer
let store = createStore( reducer ); console.log(store.getState()) // { counter:0 , todos:[] } store.dispatch({
type: 'INCREMENT'
}) console.log(store.getState()) // { counter:1 , todos:[] }

redux (一)的更多相关文章

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

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

  2. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  3. RxJS + Redux + React = Amazing!(译二)

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

  4. redux学习

    redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...

  5. webpack+react+redux+es6开发模式

    一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...

  6. Redux初见

    说到redux可能我们都先知道了react,但我发现,关于react相关的学习资料很多,也有各种各样的种类,但是关于redux简单易懂的资料却比较少. 这里记录一下自己的学习理解,希望可以简洁易懂,入 ...

  7. react+redux教程(八)连接数据库的redux程序

    前面所有的教程都是解读官方的示例代码,是时候我们自己写个连接数据库的redux程序了! 例子 这个例子代码,是我自己写的程序,一个非常简单的todo,但是包含了redux插件的用法,中间件的用法,连接 ...

  8. react+redux教程(七)自定义redux中间件

    今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 ...

  9. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  10. react+redux教程(五)异步、单一state树结构、componentWillReceiveProps

    今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...

随机推荐

  1. Android 文件下载三种基本方式

    一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = & ...

  2. 通过修改注册表设置windows环境变量

    开发环境搭建每次都要设置很多环境变量, 一般是通过  [菜单]->[计算机]->[属性]->[高级设置]->[环境变量]进行设置,重装系统后,每次都要设置很多环境变量,很麻烦. ...

  3. Java经典编程题50道之三十九

    写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class Example39 {    public static void main(String[] a ...

  4. 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)

    在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...

  5. Mybatis学习之道(一)

    本例子为采用的mysql+maven+mybatis构建. 初步学习mybatis: mybatis为一个半自动框架,相对于hibernate来说他更加轻巧,学习成本更低. 1.新建一个maven工程 ...

  6. Java——正则表达式

    题目: java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码. 注意:只填写缺少代码,不要 ...

  7. 基础--Redis在Linux环境下的安装

    1. 安装redis服务 1.1 检查安装依赖程序 yum install gcc-c++yum install -y tclyum install wget 1.1.1 下载redis安装包 (或者 ...

  8. Linux分区和挂载(mount命令的学习)

    当Windows系统出现问题的时候,可能需要重装系统,这个时候我们往往会使用系统盘将系统重新安装在C盘上,其他盘上的文件都没有受到重装系统的影 响,这就是分区的好处之一.同样,在Linux中也需要分区 ...

  9. 奶瓶beini系统

    奶瓶(beini)这个系统,是一款基于 Tiny Core Linux 搭建的无线网络安全测试系统,当然由于它是用来安全测试的系统,因此在安全方面自然有着强大的功能.而且,这个系统非常简便易学,因此现 ...

  10. Java Web项目(Extjs)报错一

    1.Java Web(Extjs)项目报错一 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -no ...