redux (一)
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 (一)的更多相关文章
- RxJS + Redux + React = Amazing!(译一)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- RxJS + Redux + React = Amazing!(译二)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...
- redux学习
redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- Redux初见
说到redux可能我们都先知道了react,但我发现,关于react相关的学习资料很多,也有各种各样的种类,但是关于redux简单易懂的资料却比较少. 这里记录一下自己的学习理解,希望可以简洁易懂,入 ...
- react+redux教程(八)连接数据库的redux程序
前面所有的教程都是解读官方的示例代码,是时候我们自己写个连接数据库的redux程序了! 例子 这个例子代码,是我自己写的程序,一个非常简单的todo,但是包含了redux插件的用法,中间件的用法,连接 ...
- react+redux教程(七)自定义redux中间件
今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 ...
- react+redux教程(六)redux服务端渲染流程
今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...
- react+redux教程(五)异步、单一state树结构、componentWillReceiveProps
今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...
随机推荐
- nodejs和npm的安装
下载nodejs的压缩包 网址:https://nodejs.org/en/ 下载以tar.xz结尾的包例如:node-v8.9.4-linux-x64.tar.xz 上传包到制定的目录 可以用lrz ...
- php环境下所有的配置文件以及作用
以下主要是针对linux下的目录(windows也是一样,文件名都一样) Apache:etc/httpd.conf PHP:etc/php.ini (Apache 正在运行的 PHP 版本) M ...
- JBoss AS7(Application Server 7)的Standalone模式和Domain模式
JBoss AS7(Application Server 7)支持两种引导模式:standalone和domain(域). Standalone模式对于很多应用,并不需要domain管理能力,JBos ...
- java中public private protected default的区别
1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...
- PHP 对象数组和一般的数组的相互转化
Yii2中的对象转数组: $video = Video::find()->asArray()->one(); 把数组转化成任何你想要的对象类型的数组: function array2obj ...
- Jenkins系列——使用checkstyle进行代码规范检查
1.目标 通过jenkins使用checkstyle对代码进行规范检查并生成html报告. 构建采用shell. 2.环境 checkstyle5.7(如果是Linux版本选用tar.gz格式) ap ...
- WPF 照片墙的实现
主要参照了DevExpress的PhotoGallery实例的实现. 效果如下: 照片墙核心代码如下: PhotoGallery.xaml <local:CarouselDemoModule x ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- MAVEN自动发布更新本地和远程仓库
1.本地仓库 的更新 mvn clean package install 2.远程 仓库 的更新 mvn clean package deploy 2.1工程文件pom.xml的设置 <bu ...
- .net mvc web api 返回 json 内容时过滤值为null的属性
1.响应内容(过滤前) {"msg":"初始化成功!","code":"","success":tr ...