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. unity爬坑记录

    这里记一下平时遇到的unity bug: unity2017最好不要在prefab上面修改它上面的组件参数 最好是拖放到场景之后修改场景内的物体组件参数 完事了apply一下删掉 不这样做的话 可能u ...

  2. LaTeX 各种命令,符号

    函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{x} \acute{\eta} \check{\alpha} \grave{\eta} \breve{a} \ddot{y} ...

  3. vim插件安装总结

    vim插件安装总结 vim 插件 vundle 插件对于vim来说是一个杀手级别的神器助手,能自动补全,语法高亮,文件搜索等等,有效地提升了编程效率.下面就个人的一些安装和使用进行一个总结. 自动管理 ...

  4. 沉淀,再出发——安装windows10和ubuntu kylin15.04双系统心得体会

    安装windows10和ubuntu kylin15.04双系统心得体会 一.安装次序      很简单,两种安装次序,"先安装windows后安装linux:先安装linux后安装wind ...

  5. HDU - 4496 City 逆向并查集

    思路:逆向并查集,逆向加入每一条边即可.在获取联通块数量的时候,直接判断新加入的边是否合并了两个集合,如果合并了说明联通块会减少一个,否则不变. AC代码 #include <cstdio> ...

  6. Java NIO之缓冲区

    1.简介 Java NIO 相关类在 JDK 1.4 中被引入,用于提高 I/O 的效率.Java NIO 包含了很多东西,但核心的东西不外乎 Buffer.Channel 和 Selector.这其 ...

  7. 阿里云服务器部署笔记一(python3、Flask、uWSGI、Nginx)

    一.重置密码,并重启服务器 二.安全组配置>配置规则>添加安全组规则(为了能在本地ssh到实例) 配置如下: 此配置为允许任意公网IP登陆实例,注意windows与Linux系统端口范围不 ...

  8. jenkins+ant+jmeter自动化环境搭建(一)

                        写在最前面: jmeter:测试接口的工具,支持java语言: ant:Apache Ant是一个Java库和命令行工具,其任务是将构建文件中描述的进程作为相互 ...

  9. ssh (Spring , Struts2 , Hibernate)框架的配置使用

    思维导图(基本配置) 1. 需要引入的包 2 .spring-config.xml 的配置 <!-- 链接数据库 外部配置文件扫入 --> <context:property-ove ...

  10. R︱Rstudio 1.0版本尝鲜(R notebook、下载链接、sparkR、代码时间测试profile)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 2016年11月1日,RStudio 1.0版 ...