首页 > 其他分享 >Redux的理解?Redux的工作原理

Redux的理解?Redux的工作原理

时间:2023-02-20 00:44:28浏览次数:37  
标签:redux reducer counter state 理解 action 原理 Redux store

一、是什么

React是用于构建用户界面的,帮助我们解决渲染DOM的过程

而在整个应用中会存在很多个组件,每个组件的state是由自身进行管理,包括组件定义自身的state、组件之间的通信通过props传递、使用Context实现数据共享

如果让每个组件都存储自身相关的状态,理论上来讲不会影响应用的运行,但在开发及后续维护阶段,我们将花费大量精力去查询状态的变化过程

这种情况下,如果将所有的状态进行集中管理,当需要更新状态的时候,仅需要对这个管理集中处理,而不用去关心状态是如何分发到每一个组件内部的

redux就是一个实现上述集中管理的容器,遵循三大基本原则:

  • 单一数据源
  • state 是只读的
  • 使用纯函数来执行修改

注意的是,redux并不是只应用在react中,还与其他界面库一起使用,如Vue

二、工作原理

redux要求我们把数据都放在 store公共存储空间

一个组件改变了 store 里的数据内容,其他组件就能感知到 store的变化,再来取数据,从而间接的实现了这些数据传递的功能

工作流程图如下所示:

根据流程图,可以想象,React Components 是借书的用户, Action Creactor 是借书时说的话(借什么书), Store 是图书馆管理员,Reducer 是记录本(借什么书,还什么书,在哪儿,需要查一下), state 是书籍信息

整个流程就是借书的用户需要先存在,然后需要借书,需要一句话来描述借什么书,图书馆管理员听到后需要查一下记录本,了解图书的位置,最后图书馆管理员会把这本书给到这个借书人

转换为代码是,React Components 需要获取一些数据, 然后它就告知 Store 需要获取数据,这就是就是 Action Creactor , Store 接收到之后去 Reducer 查一下, Reducer 会告诉 Store 应该给这个组件什么数据

三、如何使用

创建一个store的公共数据区域

import { createStore } from 'redux' // 引入一个第三方的方法
const store = createStore() // 创建数据的公共存储区域(管理员)

还需要创建一个记录本去辅助管理数据,也就是reduecer,本质就是一个函数,接收两个参数stateaction,返回state

// 设置默认值
const initialState = {
  counter: 0
}

const reducer = (state = initialState, action) => {
}

然后就可以将记录本传递给store,两者建立连接。如下

const store = createStore(reducer)

下面再看看如何更改store里面数据,是通过dispatch来派发action,通常action中都会有type属性,也可以携带其他的数据

store.dispatch({
  type: "INCREMENT"
})

store.dispath({
  type: "DECREMENT"
})

store.dispatch({
  type: "ADD_NUMBER",
  number: 5
})

下面再来看看修改reducer中的处理逻辑:

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "INCREMENT":
      return {...state, counter: state.counter + 1};
    case "DECREMENT":
      return {...state, counter: state.counter - 1};
    case "ADD_NUMBER":
      return {...state, counter: state.counter + action.number}
    default: 
      return state;
  }
}

注意,reducer是一个纯函数,不需要直接修改state

这样派发action之后,既可以通过store.subscribe监听store的变化,如下:

store.subscribe(() => {
  console.log(store.getState());
})

React项目中,会搭配react-redux进行使用

完整代码如下:

const redux = require('redux');

const initialState = {
  counter: 0
}

// 创建reducer
const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "INCREMENT":
      return {...state, counter: state.counter + 1};
    case "DECREMENT":
      return {...state, counter: state.counter - 1};
    case "ADD_NUMBER":
      return {...state, counter: state.counter + action.number}
    default: 
      return state;
  }
}

// 根据reducer创建store
const store = redux.createStore(reducer);

store.subscribe(() => {
  console.log(store.getState());
})

// 修改store中的state
store.dispatch({
  type: "INCREMENT"
})
// console.log(store.getState());

store.dispatch({
  type: "DECREMENT"
})
// console.log(store.getState());

store.dispatch({
  type: "ADD_NUMBER",
  number: 5
})
// console.log(store.getState());

小结

  • createStore可以帮助创建 store
  • store.dispatch 帮助派发 action , action 会传递给 store
  • store.getState 这个方法可以帮助获取 store 里边所有的数据内容
  • store.subscrible 方法订阅 store 的改变,只要 store 发生改变, store.subscrible 这个函数接收的这个回调函数就会被执行

参考文献

  • https://cn.redux.js.org/docs/introduction/
  • https://www.redux.org.cn/docs/basics/Actions.html
  • https://lulujianglab.com/posts/大白话解析 Redux 、 redux-thunk 、redux-saga 和 react-redux

标签:redux,reducer,counter,state,理解,action,原理,Redux,store
From: https://www.cnblogs.com/chccee/p/17136024.html

相关文章

  • 《深入理解java虚拟机》第七章读书笔记——虚拟机类加载机制
    系列文章目录和关于我一丶虚拟机类加载机制是什么java虚拟机将描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可用被虚拟机直接使用的jav......
  • byte,short,int等类型的转换以及原理,原码,反码,补码
    理论:八个比特(Bit)称为一个字节(Byte),最大[11111111],即FF;两个字节称为一个字(Word,Short),最大[1111111111111111],即FFFF,两个字称为一个双字(Dword,Int),最大[1111111111111111......
  • Springcloud环境中bootstrap.yml加载原理
    如果是Springcloud项目,一般会将配置中心、注册中心等地址存入bootstrap.yml中,同时将其他的配置存入配置中心。也就是说bootstrap.yml的读取会比较靠前。下面研究其机......
  • 链式前向星介绍以及原理
    1链式前向星1.1简介链式前向星可用于存储图,本质上是一个静态链表。一般来说,存储图常见的两种方式为:邻接矩阵邻接表邻接表的实现一般使用数组实现,而链式前向星就......
  • select / poll 非阻塞原理
    应用程序通过调用select/poll函数,可以实现非阻塞编程,以下举例:intmain(intargc,char*argv[]){intfd;intret=0;char*filename;structp......
  • 内存计数基础原理
    有new、alloc、copy(计数器加一),就得release(计数器减一)////Person.h//a1////Createdbymahongminon14-4-21.//Copyright(c)2014年mahongmin.Allright......
  • Vue数据响应式底层原理
    Vue数据响应式底层原理数据响应式定义:(当数据变化的时候,会自动运行一些相关函数)原理就是通过Object.defineProperty()对属性进行劫持,当访问该属性时我们就收集依赖,当数......
  • 浅谈strtok函数的原理与使用
    对于strok函数的理解,自己也是很迷茫,尤其看到有的范例将第一参数设为NULL也很是不解,也是找了许多博文,并看了官方的英文文档才浅显地理解了。这位前辈的博文对我启发很大。链......
  • 深度剖析 ZooKeeper 核心原理 学习笔记
    什么是ZooKeeper假设对ZooKeeper中的数据做了变更(比如新增了一台Kafka或者挂掉了一个Kafka节点),这时候ZooKeeper会主动通知其他监听这个数据的客户端,立即告诉其他......
  • 如何理解 少用继承,多用组合
    HeadFirst设计模式一书中,开篇就提到了这个有趣的点:  当我们想让鸭子能飞的时候,首先跳出来的想法是给鸭子类增加一个fly()方法,然后所有的子类直接继承完事;结果,有一个......