redux & react-redux
在vue中,可以使用vuex进行数据管理,在react中,可以使用redux进行数据管理。redux主要由Store、Reducer和Action组成:
- Store:状态载体,访问状态、提交状态、监听状态变更
- Reducer:状态更新具体执行者,纯函数
- Action:存放数据的对象,即消息的载体,只能被别人操作,自己不能进行任何操作
简单使用
在redux中,首先需要了解的是store,所有的数据都在这一个数据源里面进行管理,具有全局唯一性,但是redux本身和react并没有直接的联系,可以单独使用,复杂的项目才需要redux来管理数据,简单的项目,state+props+context就足够了。
例如,我们想要实现一个简单的累加器,就需要以下几步:
- 用来存储数据的store,store里面的state是数据放置的位置
- 通过dispatch一个action来提交对数据的修改
- 请求提交到reducer函数里,根据传入的action和state,返回新的state
首先新建项目,然后执行命令npm install redux --save安装redux。
其次,在src文件夹下面新建store.js,创建store,然后根据action的不同类型,执行不同的操作:
store.js
import {createStore} from 'redux'; const counterReducer = (state = 0, action) => {
switch(action.type){
case 'add':
return state + 1;
case 'minus':
return state - 1;
default:
return state;
}
} export default createStore(counterReducer)
然后在components文件夹下面新建Test.js组件,并在组件中引入store.js
Test.js
import React, {Component} from 'react'
import store from '../store' class Test extends Component{
render(){
return (
<div>
<p>{store.getState()}</p>
<button onClick={()=>store.dispatch({type:'add'})}> + </button>
<button onClick={()=>store.dispatch({type:'minus'})}> - </button>
</div>
)
}
} export default Test;
最后使用组件,使用组件分两步:初始化渲染时,需要请求初始化的数据;后面每次数据改变时,重新加载数据。
index.js
// 初始化执行
ReactDOM.render(<Test />, document.getElementById('root'));
// 每次发生变化时执行
store.subscribe(()=>{
ReactDOM.render(<Test />, document.getElementById('root'));
})
react-redux
如果在大型项目中,我们每次都在需要使用的地方重新调用render,会十分麻烦,所以,需要使用更简洁的方法:react-redux,react-redux提供了两个api:提供数据的顶级组件Provider和提供数据与方法的高阶组件connect。
首先,要实现react-redux,需要先进行安装:npm install react-redux --save
其次,既然要用到高阶组件,就需要使用高阶组件装饰器:npm install --save-dev babel-plugin-transform-decorators-legacy,具体的可以参考前面的react高阶组件。
最后,来改写上面的累加器组件。
1,在index.js中引入Provider组件,并进行相应的修改,这样,后面就不需要再每个需要的页面多次引入store.js了,更不用在每次操作了数据以后重新render。
index.js
import store from './store';
import Test from './components/Test';
import {Provider} from 'react-redux' ReactDOM.render((
<Provider store={store}>
<Test />
</Provider>
), document.getElementById('root')); serviceWorker.unregister();
2,在Test.js页面,重新更改写法,使用高阶组件connect来提供数据和方法:
import React, {Component} from 'react'
import { connect } from "react-redux"; @connect(
state => ({ num: state }), // 状态映射
{
add: () => ({ type: "add" }),
minus: () => ({ type: "minus" })
}
) class Test extends Component{
render(){
return (
<div>
<p>{this.props.num}</p>
<button onClick={()=>this.props.add()}> + </button>
<button onClick={()=>this.props.minus()}> - </button>
</div>
)
}
} export default Test;
代码下载:点这里
redux & react-redux的更多相关文章
- RxJS + Redux + React = Amazing!(译一)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...
- RxJS + Redux + React = Amazing!(译二)
今天,我将Youtube上的<RxJS + Redux + React = Amazing!>的后半部分翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: ht ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- react+redux教程(六)redux服务端渲染流程
今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...
- react+redux教程(五)异步、单一state树结构、componentWillReceiveProps
今天,我们要讲解的是异步.单一state树结构.componentWillReceiveProps这三个知识点. 例子 这个例子是官方的例子,主要是从Reddit中请求新闻列表来显示,可以切换reac ...
- 基于React,Redux以及wilddog的聊天室简单实现
本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...
- react+redux官方实例TODO从最简单的入门(6)-- 完结
通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...
- react+redux官方实例TODO从最简单的入门(1)-- 前言
刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...
- 重写官方TodoList,对于初学react+redux的人来说,很有好处
虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...
- react+redux教程(四)undo、devtools、router
上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...
随机推荐
- Matlab:Crank Nicolson方法求解线性抛物方程
tic; clear clc M=[,,,,,,];%x的步数 K=M; %时间t的步数 :length(M) hx=/M(p); ht=/K(p); r=ht/hx^; %网格比 x=:hx:; t ...
- mysql,Jdbc工具类,只需一条sql实现简单查询
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...
- springcloud-Eureka-服务注册与发现核心组件
Eureka组件 Eureka是Netfilx开源的服务发现组件,本身是一个基于rest的服务,它包含client和server两部分. Spirng Cloud将它集成在子项目Spirng Clou ...
- 在Linux终端安装Julia
官方参考文档:https://julialang.org/downloads/platform.html#generic-binaries 一.centos终端安装 打开Linux终端输入 sudo ...
- 2.5 定义FTP工具的各种方法
用class定义ftp工具的各种方法 import os,sys from ftplib import FTP from mimetypes import guess_type,add_type fr ...
- 一、JAVA变量类型:②局部变量
局部变量声明在方法.构造方法或者语句块中: public class Test{ public void pupAge(){ int age = 0; //定义age为方法pupAge中的局部变量,并 ...
- THML
结构<!DOCTYE html> <html> <head> <meta charset="UTF-8> <titie>< ...
- springcloud Ribbon学习笔记一
上篇已经介绍了如何开发eureka服务并让多个服务进行相互注册,接下来记录如何开发一个服务然后注册到eureka中并能通过ribbon成功被调用 开发一个用户服务并注册到eureka中,用户服务负责访 ...
- python基础07_tuple_dict
tuple 元组 dict 字典 更详细参考:https://www.cnblogs.com/jin-xin/articles/7562422.html #!/usr/bin/env pyth ...
- 3.oracle与mysql的区别
1.自动增长的数据类型处理 MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的 ...