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. vscode使用ES6装饰器器语法

    1. react项目 配置 package.json 需要安装 npm i @babel/plugin-proposal-decorators 可能需要重启项目 { "babel" ...

  2. 【Oracle】对一个已经拥有重复数据的表的列设置唯一性约束

    对一个已经拥有重复数据的表的列设置唯一性约束 在这种情况下创建唯一性约束,可以发现会报错,通常为由于存在重复的键值,无法生效唯一性约束 最简单的方法,就是删除重复的记录,这样就可以按照正常流程,创建唯 ...

  3. 【pytorch学习】之数据预处理

    2 数据预处理 为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始.在Python中常用的数据分析工具中,我们通常使用pandas软件包.像庞大的 ...

  4. MaxCompute同步数据的网络配置

    MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库.数据集成功能已经集成到DataWorks作为 ...

  5. [Go] httprouter 自动 OPTIONS 响应 和 CORS

    httprouter 是 Gin framework 使用的路由组件. 要对 OPTIONS 请求自动响应,比如支持 CORS 请求或者设置请求头,可用 Router.GlobalOPTIONS. r ...

  6. win10 uwp 笔迹书写预测 墨迹书写加速

    在 UWP 的 InkCanvas 里自带了预测书写轨迹的功能,开启此功能可以进行书写预测,从而减少书写延迟.本文将告诉大家如何在 UWP 的 InkCanvas 里开启笔迹书写预测功能 在 UWP ...

  7. dotnet 6 修复在 System.Text.Json 使用 source generation 源代码生成提示 SYSLIB1032 错误

    在 dotnet 6 内置了通过源代码生成的方式进行序列化 JSON 对象,性能非常高.使用的时候需要将 Json 序列化工具类换成 dotnet 运行时自带的 System.Text.Json 进行 ...

  8. P10118 『STA - R4』And

    P10118 『STA - R4』And 题意:给定 A,B,求 \(\sum y - x\),其中 x,y 满足: x < y x + y = A x & y = B 对于加运算和与运 ...

  9. 接私活利器!推荐一个基于SpringBoot3的后台管理框架

    大家好,我是 Java陈序员. 今天,给大家推荐一个后台管理框架,适合二次定制开发.接私活.源码学习等场景. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电 ...

  10. spire.Doc -Index was out of the range

    一直以来用的好好的,突然有一天出现:Index was out of the range   ED04211_邵武市易逸行软件技术服务有限公司(万顺出行)_其他 升级后问题: 1.合并单元格出现问题 ...