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 ...
随机推荐
- 『TensorFlow』读书笔记_VGGNet
VGGNet网络介绍 VGG系列结构图, 『cs231n』卷积神经网络工程实践技巧_下 1,全部使用3*3的卷积核和2*2的池化核,通过不断加深网络结构来提升性能. 所有卷积层都是同样大小的filte ...
- C++中数组声名后不初始化,数组里的值都是0吗?
这得看数组的申明情况: 1.全局/静态数组 如果申明的是全局/静态数组,系统会把数组的内容自动初始化为0. 2.局部数组 如果申明的是局部数组,数组的内容会是随机的,不一定是0.如函数内声明: int ...
- 在Eclipse下搭建Hibernate框架(加载hibernate工具插件,离线)
下载hibernate工具包完成之后,对其进行解压可以得到众多文件夹,其中就有一个jbosstools-hibernate开头的文件夹,进入其中可以得到features和plugins两个文件夹,在E ...
- 页面系统,浏览器检测- 网页基础模块(JavaScript)
// 浏览器检测,获取,弹出框提醒IE 返回浏览器详情 function GetbrowserSys() { var BrowserMatch = { init: function() { this. ...
- 微信小程序Promise对象
Promise 对象 Promise 的含义 基本用法 Promise.prototype.then() Promise.prototype.catch() Promise.prototype.fin ...
- input输入框只能输入正整数
<input type="text" value="1" onkeyup="if(this.value.length==1){this.valu ...
- SVN 常见报错
1.svn is out of date 出错原因:SVN服务器端的版本比你的版本要新,不允许提交. 解决方案1:右键你所要提交的文件,team-->update 更新最新版本 然后再提 ...
- vue项目中多个组件之间传递数据
//父组件<template> <div> <div style="float: left"> <input-data :city=&qu ...
- 调用shutdown.sh后出现could not contact localhost8005 tomcat may not be running报错问题
之前调用tomcat的shutdown.sh无法关闭tomcat,一直报could not contact localhost8005 tomcat may not be running错. 在网上找 ...
- angular2升级到angular4历程
Angular 4 在昨天(2017-03-24)正式发布了,我的系列教程也得更新一下.步骤略繁琐,不用 cli 的项目反倒更简单一些,但是 cli 平时给我们的便利还是很多的,升级最多半年一次而已. ...