在vue中,可以使用vuex进行数据管理,在react中,可以使用redux进行数据管理。redux主要由Store、Reducer和Action组成:

  • Store:状态载体,访问状态、提交状态、监听状态变更
  • Reducer:状态更新具体执行者,纯函数
  • Action:存放数据的对象,即消息的载体,只能被别人操作,自己不能进行任何操作

简单使用

在redux中,首先需要了解的是store,所有的数据都在这一个数据源里面进行管理,具有全局唯一性,但是redux本身和react并没有直接的联系,可以单独使用,复杂的项目才需要redux来管理数据,简单的项目,state+props+context就足够了。

例如,我们想要实现一个简单的累加器,就需要以下几步:

  1. 用来存储数据的store,store里面的state是数据放置的位置
  2. 通过dispatch一个action来提交对数据的修改
  3. 请求提交到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的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 基于React,Redux以及wilddog的聊天室简单实现

    本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...

  7. react+redux官方实例TODO从最简单的入门(6)-- 完结

    通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...

  8. react+redux官方实例TODO从最简单的入门(1)-- 前言

    刚进公司的时候,一点react不会,有一个需求要改,重构页面!!!完全懵逼,一点不知道怎么办!然后就去官方文档,花了一周时间,就纯react实现了页面重构,总体来说,react还是比较简单的,由于当初 ...

  9. 重写官方TodoList,对于初学react+redux的人来说,很有好处

    虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那 ...

  10. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

随机推荐

  1. 1018. Binary Prefix Divisible By 5可被 5 整除的二进制前缀

    网址:https://leetcode.com/problems/binary-prefix-divisible-by-5/ 一次for循环遍历数组,在上次计算的基础上得到本次的结果! class S ...

  2. koa和express对比

    不同: 1.启动方式不同 koa采用了new Koa()的方式,而express采用传统的函数形式 2.中间件形式二者不一样,这是由二者处理中间件的逻辑差异导致的,实际上这也是二者最根本的差别 3.k ...

  3. 多线程中Object的wait(),notify()和Condition的wait()和singal()对锁的关联

    通常将共享资源的操作放置在Sysnchronized定义的区域内,这样当其他线程也获取到这个锁时,必须的等待锁被释放时才能进入该区域.Object为任意一个对象,每个对象都存在一个标志位,并具有两个值 ...

  4. python之路--面向对象(三)

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象.由于Python中一切都是类,所以 ...

  5. codeblock不能调试

    问题:codeblock  不能调试,如下图: 解决方法: 首先,项目的保存路径不能是中文路径. 其次,必须创建工程. 最后,build选项里select target选成debug codebloc ...

  6. Mac系统在Pycharm中切换解释器

    1. 2. 3. 4. 5.

  7. Linux常用内核参数

    Linux常用内核参数 TCP状态描述 CLOSED:无连接是活动的或正在进行的 LISTEN:服务器在等待进入呼叫 SYN-RECV:一个连接请求已经到达,等待确认 SYN-SENT:应用已经开始, ...

  8. 过滤器(filter),监听器(listener),与servlet的执行顺序

    创建: 加载顺序 监听器-->过滤器-->Servlet.项目启动后,容器会首先创建声明的各种监听器,为后继的各个事件监听做准备,然后创建过滤器,最后是Servlet.销毁的时候是反序进行 ...

  9. nginx——Nginx 处理事件模型

    Nginx 的连接处理机制在不同的操作系统会采用不同的 I/O 模型,要根据不同的系统选择不同的事件处理模型,可供选择的事件处理模型有:kqueue .rtsig .epoll ./dev/poll ...

  10. laravel 解决保存Emoji 表情问题

    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ALTER TABLE table ...