Redux基本概念和使用

先从Flux开始

先放一个Flux官网的链接。需要fq。

Flux是Facebook提出的一种构建客户端网页应用的应用架构,它是一种抽象程度很高的设计模式,鼓励单向数据流。

在之前的MVC架构中,在小型应用中,Model和View较少时,关系不复杂,维护轻松。但是一旦功能越来越复杂,将难以维护,多个Model和多个View之间存在着多对多的关系,在开发时,需要花费很多时间去处理Modal间的关系。

Flux架构的关键在于单向数据流,他由三部分构成——

  1. dispatcher
  2. stores
  3. 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基本概念和使用的更多相关文章

  1. react系列(五)在React中使用Redux

    上一篇展示了Redux的基本使用,可以看到Redux非常简单易用,不限于React,也可以在Angular.Vue等框架中使用,只要需要Redux的设计思想的地方,就可以使用它. 这篇主要讲解在Rea ...

  2. react系列(一)JSX语法、组件概念、生命周期介绍

    JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...

  3. react系列教程

    这个系列将从基础语法讲起,把react全家桶都讲到,然后到具体的使用,最后完成后,会写一个完整的demo. 前置要求: 基本的CSS,JS要熟练. 部分ES6语法需要了解.可以参考下面提到的阮一峰老师 ...

  4. 在React中使用Redux

    这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  5. react系列从零开始-react介绍

    react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到w ...

  6. Redux 核心概念

    http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html .本文不是官方文档的翻译. ...

  7. React 系列教程 1:实现 Animate.css 官网效果

    前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果.对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就 ...

  8. 《ASP.NET Core In Action》读书笔记系列四 创建ASP.NET Core 应用步骤及相应CLI命令

    一般情况下,我们都是从一个模板(template)开始创建应用的(模板:提供构建应用程序所需的基本代码).本节使用 Visual Studio 2017 .ASP.NET Core2.0和 Visua ...

  9. Redux 基础概念

    Redux is a predictable state container for JavaScript apps.,亦即 Redux 希望能提供一个可以预测的 state 管理容器,让开发者可以可 ...

随机推荐

  1. cocos-creator 脚本逻辑-2

    1.预制体 1)节点操作 Cc.find(‘node-1’) 获取节点 全局事件 作用于 canvas this.node.destroy() 删除节点(从内存中删除) 添加删除获取节点或组件 let ...

  2. 记录开发Nodejs c++ addon的一些经验(二、数据类型的转换(尤其是Buffer))

    常见的数据类型的转换基本比较容易,结合nan应该不是一件难事 参考链接: http://blog.jobbole.com/109598/ http://deadhorse.me/nodejs/2012 ...

  3. jquery插件一直报错:xx is not a function

    当然像js文件未引用或者js插件使用方法不对这样的解决办法想必大家都已经试过了. 那么在放弃前请最后看一下是不是引用了两个jquery文件. 引用了两个jquery文件! 引用了两个jquery文件! ...

  4. ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误

    ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误 1.测试环境说明 ArcSDE版本:10.2.2 Oracle版本:12.1.0.1和11. ...

  5. CSS浮动并清除浮动(造成的影响)

    一.浮动 CSS浮动    CSS float浮动的深入研究.详解及拓展(一)    CSS浮动属性Float详解 块级元素独占一行 块级元素,在页面中独占一行,自上而下排列,也就是传说中的流. 可以 ...

  6. arm汇编学习(六)---跳转到thumb状态

    通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...

  7. Python unittest模块心得(一)

    关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...

  8. 面对IBM与亚马逊的犄角攻势,微软云如何招架?

    亚马逊AWS和微软Azure是全球公有云的焦点.不就前公布的财报不久前公布的财报,这两家公司云计算的收入越来越接近,从数据显示来看,亚马逊的利润比微软稍高,有人称微软云的高增长来自于捆绑销售,背后真正 ...

  9. 如何判断单链表是否存在环 & 判断两链表是否相交

    给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...

  10. 【Leetcode】【Medium】Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...