react系列(四)Redux基本概念和使用
Redux基本概念和使用
先从Flux开始
先放一个Flux官网的链接。需要fq。
Flux是Facebook提出的一种构建客户端网页应用的应用架构,它是一种抽象程度很高的设计模式,鼓励单向数据流。
在之前的MVC架构中,在小型应用中,Model和View较少时,关系不复杂,维护轻松。但是一旦功能越来越复杂,将难以维护,多个Model和多个View之间存在着多对多的关系,在开发时,需要花费很多时间去处理Modal间的关系。
Flux架构的关键在于单向数据流,他由三部分构成——
- dispatcher
- stores
- views(React components)

从一次Action触发,Dispatcher将它dispatch到store,更新store,store的变化同步更新到对应的view层。等待下一次的Action触发。
这个过程中,数据始终是单向流动的。
社区基于Flux有多种实现,其中Dan大神的Redux最受推崇,已经成为事实标准。
Redux
前面的文章提到了组件间通信的几种方式,context API在小规模共享应用时值得一试。今天主要讲解react全家桶中的Redux。
概念
在说概念之前,先看一张图:
| 图片来源 https://css-tricks.com/learning-react-redux/
根据上面的图片,可以发现Redux相当于一个全局的Provider。各个子组件是Consumer。
当然,Redux不只是简单的提供一个全局Provider。
它有以下几个特点:
1.唯一数据源
不同于Flux的实现,Redux只有一个唯一的数据源,它提供一个深层嵌套的对象来存放所有数据。
2.状态只读
在Redux中,所有的状态都是只读的,如果要修改state,则需要dispatch一个action,reducer通过action的type,选择执行不同的操作,返回新的状态。
3.通过纯函数改变状态
纯函数的概念很简单,一个函数,给定输入,则确定输出,不受其他因素影响,也不会影响原来的引用。
由于Redux提倡纯函数对状态进行处理,不会更改之前的对象,对于操作
fn(x) = y;
只要x给定,则y一定是确认值。这样不论是之后进行很方便来追踪数据的更改,debug,时间回溯,都非常方便。
使用
Redux的API非常简单,这里是Redux API文档。
我们只需要使用两个API就能使用到Redux。
// 创建一个Reducer
let countReducer = (state = 0, action) => {
if (action.type === 'ADD') {
state++;
}
return state;
}
// 创建一个Store
var store = Redux.createStore(countReducer);
// dispatch一个action
store.dispatch({
type: 'ADD'
});
如果有多个State,比如,count和user,则需要使用combineReducers方法。
import { createStore, combineReducers } from 'redux';
// The User Reducer
const userReducer = (state = {}, action) => {
return state;
}
// The Widget Reducer
const countReducer = (state = {}, action) => {
return state;
}
// Combine Reducers
const reducers = combineReducers({
userState: userReducer,
countState: countState,
});
const store = createStore(reducers);
在实际使用时,有ActionCreateor的概念,其实并不复杂,就是一个函数,返回响应的Action。可以在这个函数中对Action做一些逻辑的判断处理。
CountActionCreators.js
export function plus() {
return {
type: 'PLUS'
};
}
export function minus() {
return {
type: 'MINUS'
};
}
接下来需要调用bindActionCreators。
let one = bindActionCreators({ plusOne, minusOne }, store.dispatch);
store.subscribe(() => console.log(store.getState()));
one.plusOne();
one.minusOne();
这里是一个完整的例子-codesandbox。
下一篇讲解在React中使用Redux。
感谢阅读。
react系列(四)Redux基本概念和使用的更多相关文章
- react系列(五)在React中使用Redux
上一篇展示了Redux的基本使用,可以看到Redux非常简单易用,不限于React,也可以在Angular.Vue等框架中使用,只要需要Redux的设计思想的地方,就可以使用它. 这篇主要讲解在Rea ...
- react系列(一)JSX语法、组件概念、生命周期介绍
JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...
- react系列教程
这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...
- 在React中使用Redux
这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...
- react系列从零开始-react介绍
react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到w ...
- Redux 核心概念
http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html .本文不是官方文档的翻译. ...
- React 系列教程 1:实现 Animate.css 官网效果
前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果.对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就 ...
- 《ASP.NET Core In Action》读书笔记系列四 创建ASP.NET Core 应用步骤及相应CLI命令
一般情况下,我们都是从一个模板(template)开始创建应用的(模板:提供构建应用程序所需的基本代码).本节使用 Visual Studio 2017 .ASP.NET Core2.0和 Visua ...
- Redux 基础概念
Redux is a predictable state container for JavaScript apps.,亦即 Redux 希望能提供一个可以预测的 state 管理容器,让开发者可以可 ...
随机推荐
- cookie实现记住登录名和密码
在最近学习的session作用域中,顺便了解了一下cookie, session是存放在服务器中,而cookie是存放在客户端中. 本篇文章主要是使用cookie来实现记住密码的功能. 简单的logi ...
- Web前端面试指导(二十):JavaScript中如何翻转一个字符串?
题目点评 字符串作在程序中是非常常见的,因为程序中绝大部分的数据都可以当作字符串来处理.需要对字符的处理方法比较熟悉,在回答的时候尽量能够说出多种解决方法更好! 字符串翻转的方法 1)使用字符串函数 ...
- vue中数组删除,页面没重新渲染
创建一个组件时,数据类型是数组,在删除这个数组中的数据时,数组中的数据是对的,但页面渲染的数据却不对. 举例:(不一定复现) <ul> <li v-for="(item, ...
- React Native之React速学教程(上)
概述 本篇为<React Native之React速学教程>的第一篇.本篇将从React的特点.如何使用React.JSX语法.组件(Component)以及组件的属性,状态等方面进行讲解 ...
- SSRS 2008R2 执行Log 查询
1. 可以参考ExecutionLog3试图,此为系统安装Reporting Service自带的试图. 2. 可以使用以下语句查询: SELECT els.LogEntryId, els.Insta ...
- 浅谈PVC塑料配方计算软件的设计
1, 配方设计与配方计算 题目是配方计算,不是配方设计,设计是需要有深厚的塑料知识才可以做的,即生产什么塑料产品,需要放各种原料是什么,各自比较是多少,遇到什么情况下就要多放什么,少放什么.配方设计不 ...
- Android recyclerview删除item刷新列表
删除item坑 mModels.remove(i); notifyItemRemoved(i); //必须调用这行代码 notifyItemRangeChanged(i, mModels.size() ...
- Netty入门3之----Decoder和Encoder
Netty强大的地方,是他能方便的实现自定义协议的网络传输.在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器.在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务 ...
- OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四种复制方式-单层文件夹复制
字节流两套: java.lang.Object--java.io.OutputStream--java.io.FileOutputStream java.lang.Ob ...
- Controller与View数据传递 多Model传递
1)ViewBag变量方式 使用4个ViewBag变量进行数据传递,Data1.Data2.Data3.Data4的数据直接从数据库里调. Control中伪代码如下所示: 1 public Acti ...