https://www.redux.org.cn/

2013年 Facebook 提出了 Flux 架构的思想,引发了很多的实现。2015年,Redux 出现,将 Flux 与函数式编程结合一起,很短时间内就成为了最热门的前端架构。

简单说,如果你的UI层非常简单,没有很多互动,Redux 就是不必要的,用了反而增加复杂性。如果你的项目组件的数量和层级也变得越来越多,越来越深,此时组件间的数据通信就变得异常的复杂和低效,为了解决这个问题,引入了状态管理(redux)从而很好的解决多组件之间的通信问题。

安装Redux

redux不是内嵌在react框架中,使用时需要手动去安装

npm i -S redux

  • 单一数据源

整个应用的 state 被储存在一棵对象结构中,并且这个对象结构只存在于唯一一个 store 中

不能直接去修改此数据源中的数据(数据深拷贝)

  • State 是只读的

state redux中的state

唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。

action只能是一个对象

  • 使用纯函数(reducer)来执行修改

为了描述 action 如何改变 state tree ,你需要编写 reducer,reducer只是一些纯函数,它接收先前的 state 和 action,并返回新的 state

操作原理图

使用redux

创建统一数据源

store的index.js// 统一数据仓库

// * as 名称  as es6模块化导入起别名
// * 用export导出所有的方法或对象
// import * as redux from 'redux' // createStore 创建一个数据仓库
import { createStore } from 'redux' // 默认数据源不能直接修改
const defaultState = {
count = 1
} // reducer纯函数 reducer中不修改state中的数据,只能返回新的state数据 (深拷贝)
// 此参数是一个对象,是通过dispatch发送过来的,一般两个值
/*
// action 动作对应的数据可以为任意数据类型
{type:'动作',payload:mixed}
*/
function reducers(state = defaultState, action) {
if ('incr' === action.type) {
// 返回新的state
return { count: state.count + 1 }
}
return state
}
// 创建仓库
const store = createStore(
reducers,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
) // 导出

export default store

在组件里面使用
import React, { Component } from 'react'
// 引入数据源
import store from './store'
export default class App extends Component {
  constructor(props) {
    super(props);
    /* this.state = {
      count:store.getState().count
    } */
    this.state = store.getState()
    // 订阅
    /* store.subscribe(()=>{
      this.setState(state=>{
        return {
          count:store.getState().count
        }
      })
    }) */
    store.subscribe(() => {
      // 如果有数据修改,则会自己更新状态数据
      this.setState(state => store.getState())
    })
  }
  render() {
    return (
      <div>
        <h3>{this.state.count}</h3>
        <button onClick={this.incr}>+++</button>
      </div>
    )
  }
  incr = () => {
    // action creator必须是对象
    const actionCreator = {
      type: 'incr',
      payload: 1
    }
    // 派发一个任务给reducer 给一个任务清单
    store.dispatch(actionCreator)
  }
}

状态管理(redux)的更多相关文章

  1. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  2. [Full-stack] 状态管理技巧 - Redux

    资源一: In React JS Tutorials, lectures from 9. From: React高级篇(一)从Flux到Redux,react-redux 从Flux到Redux,再到 ...

  3. 状态管理(Vuex、 Flux、Redux、The Elm Architecture)

    1.https://vuex.vuejs.org/zh-cn/intro.html (vuex) 这就是 Vuex 背后的基本思想,借鉴了 Flux.Redux.和 The Elm Architect ...

  4. 微信小程序里使用 Redux 状态管理

    微信小程序里使用 Redux 状态管理 前言 前阵子一直在做小程序开发,采用的是官方给的框架 wepy , 如果还不了解的同学可以去他的官网查阅相关资料学习:不得不说的是,这个框架确相比于传统小程序开 ...

  5. react+redux状态管理实现排序 合并多个reducer文件

    这个demo只有一个reducer 所以合并reducer这个demo用不到 ,但是我写出来这样大家以后可以用到,很好用,管理多个reducer,因为只要用到redux就不会只有一个reducer所以 ...

  6. 借鉴redux,实现一个react状态管理方案

    react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...

  7. Mobx | 强大的状态管理工具 | 可以用Mobx来替代掉redux

    来源简书 电梯直达 https://www.jianshu.com/p/505d9d9fe36a Mobx是一个功能强大,上手非常容易的状态管理工具.就连redux的作者也曾经向大家推荐过它,在不少情 ...

  8. redux沉思录:基于flux、状态管理、函数式编程的前端状态管理框架

    基于flux和reduce的通信和状态管理机制; 和数据库管理系统一样,redux是一个状态管理系统(或机制). const store = createStore( reducer, compose ...

  9. 你再也不用使用 Redux、Mobx、Flux 等状态管理了

    Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...

  10. 状态管理之 Flux、Redux、Vuex、MobX(概念篇)

    本文是对 Flux.Redux.Vuex.MobX 几种常用状态管理模式的总结,偏向于概念层面,不涉及过多代码. 状态管理 什么是状态管理? 状态管理就是,把组件之间需要共享的状态抽取出来,遵循特定的 ...

随机推荐

  1. Oracle with的重复使用(递归)

    Oracle with的重复使用(递归) 写力扣的时候学到了新的方法 Recursive WITH Clauses 通常来说如果直接使用with XXX as ()这种,是没发直接使用自身的数据的 例 ...

  2. 阿里云数字化安全生产平台 DPS V1.0 正式发布!

    ​简介:数字化安全生产平台则帮助客户促进业务与 IT 的全面协同,从业务集中监控.业务流程管理.应急指挥响应等多维度来帮助客户建立完善专业的业务连续性保障体系. 作者:银桑.比扬 阿里云创立于 200 ...

  3. Paillier半同态加密:原理、高效实现方法和应用

    ​简介: <数据安全法>已于9月1日起正式实施,两个月后<个人信息保护法>也将开始施行,意味着数据安全和隐私保护方面的监管将会在年内陆续到位.在合规收紧大背景下,"数 ...

  4. [FAQ] 钉钉 Excel 回车键不能换行 ? 在线编辑如何换行

      Win 端表格换行:AIT+ENTER Mac 端表格换行:AIT OPTION+ENTER Tool:ChatAI Refer:钉钉技巧 Refer:https://www.dingtalk.c ...

  5. [FAQ] JS 时间戳格式化为 date

    拷贝使用,不用引入第三方库 function formatDate (date = 0, fmt = 'yyyy-MM-dd hh:mm:ss') { date = new Date(+date) i ...

  6. dotnet C# 通过 Vortice 将 ID2D1CommandList 作为特效的输入源

    使用 Direct2D 过程中将可以使用到 Direct2D 强大的特效功能,比如给某些界面绘制内容添加特效支持.本文将告诉大家如何通过 Vortice 将 ID2D1CommandList 作为特效 ...

  7. WPF 已知问题 BitmapDecoder.Create 不支持传入 Asynchronous 的文件流

    这是在 GitHub 上有小伙伴报的问题,在 WPF 中,不支持调用 BitmapDecoder.Create 方法,传入的 FileStream 是配置了 FileOptions.Asynchron ...

  8. 2018-6-30-dotnet-设计规范-·-抽象类

    title author date CreateTime categories dotnet 设计规范 · 抽象类 lindexi 2018-6-30 9:2:38 +0800 2018-06-30 ...

  9. 九、ODBC External Table Of Doris

    ODBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(ODBC)来访问外部表 ODBC Driver的安装和配置: 要求所有的BE节点都安装上相同的Dri ...

  10. 题解:ssy的队列

    题目链接 题目描述 SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有 \(N\) 个身高互不相同的同学,请你求出这 \(N\) 个人的所有排列中任意两个相邻同学的身高差均不为给定 ...