Redux的基础用法详解(纯函数的概念)

简介: 和vue中的vuex一样,react也有进行状态管理的工具,最近自己在学习这一块的内容所以在此记录一下

前言

和vue中的vuex一样,react也有进行状态管理的工具,最近自己在学习这一块的内容所以在此记录一下

什么是Redux

Redux是JS的状态容器,提供了可预测的状态管理。JavsScript的状态容器就是装状态的容器,React中,状态就是state。因此我们所谓的JS的状态容器就是去存储状态state的容器。通常在大型项目中使用Redux进行状态管理

为什么需要Redux

  1. React管理不断变化的state是非常困难的,需要通过constructor去定义state,要通过this.setState去修改这个state。
  2. React是在视图层帮助我们解决了DOM的渲染过程,但是State依然是留给我们自己来管理。之前学习过的组件传值props、context等等,
  3. 当没有使用redux的时候我们实现兄弟组件传值是比较麻烦的,代码很复杂冗余。

Redux的使用

  1. 安装
npm init -y
npm i redux -D
  1. 使用

新建一个index.js文件,在index.js去定义相关的内容,下面我直接把关键的地方写上了对应的注释,注意要记住redux中的三个核心:store、action、reducer

// index.js的内容
const redux = require('redux')
// redux有三大块:store、action、reducer

const initState = {
    count: 0
}

// 3、reduce 是去连接store和action的
const reducer = (state=initState, action) => {
    switch(action.type) {
        case 'INCREMENT': 
            return {...state, count: state.count + 1}
        // 如果没有匹配到任何的action就直接返回state
        default:
            return state
    }
}

// 1、store 保存状态,创建一个store对象即可
const store = redux.createStore(reducer)


// 2、action 是用来修改store的
const action = { type: 'INCREMENT' }

// 5、在派发action之前可以订阅store的修改,监听store的变化
store.subscribe(() => {
    console.log('store被修改了')
})

// 4、派发action
store.dispatch(action)

这个时候我们去用node运行一下index.js会打印出'store被修改了'
如果我们想要获取对应的状态,我们可以在subscribe中获取

store.subscribe(() => {
    // console.log('store被修改了')
    console.log(`count: ${store.getState().count}`) // count: 1
})

纯函数的概念

reducer就是一个纯函数,我们是不需要直接修改state的,我们不是直接拿count进行修改的。那这里我们来看一下什么是纯函数。

简单来说纯函数有如下特点:
1、函数的返回结果只依赖于它的参数
2、函数在执行的过程中是没有副作用

比如下面例子 判断是不是纯函数:

const a = 10
const fn = (b) => a + b
console.log(fn(3))

fn的返回结果取决于a和b的值,所以它不是纯函数!下面改写为纯函数

const a = 10
const fn = (x, y) => x + y // 函数的返回结果只依赖于它的参数
console.log(fn(1, 3))

再来看一个例子:

const fnfn = (obj, b) => {
    obj.x = 3
    return obj.x + b
}
const obj1 = {x: 1}
console.log(fnfn(obj1, 3))
console.log(obj1.x)

这个fnfn函数也不是纯函数!因为它有副作用,倒数第三行我们定义obj.x为1,但是最后一行打印出来为3,因为fnfn函数对obj.x的值进行了了修改。故它不是纯函数,下面进行纯函数的改写:

const fnfn = (obj, b) => {
    return obj.x + b
}
const obj1 = {x: 1}
console.log(fnfn(obj1, 3))
console.log(obj1.x)

总结

使用Redux的五步骤为:

  1. 创建一个对象,作为状态state
  2. 创建Store存储state
  3. 通过action来修改state
  4. 修改reducer中的处理代码
  5. 可以在派发action之前,监听store的变化

本篇文章介绍了Redux使用的基础方法,后面会继续介绍Redux在项目中的使用以及它的其它特性

相关文章
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
509 1
|
9月前
|
人工智能 并行计算 PyTorch
TripoSR:开源3D生成闪电战!单图0.5秒建模,Stability AI颠覆设计流程
TripoSR是由Stability AI和VAST联合推出的开源3D生成模型,能在0.5秒内从单张2D图像快速生成高质量3D模型,支持游戏开发、影视制作等多领域应用。
529 13
TripoSR:开源3D生成闪电战!单图0.5秒建模,Stability AI颠覆设计流程
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
存储 缓存 网络协议
计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】
计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】
|
机器学习/深度学习 监控 自动驾驶
利用深度学习技术优化图像识别准确性
【5月更文挑战第21天】 在当前的计算机视觉领域,图像识别的准确性至关重要。随着深度学习技术的迅猛发展,卷积神经网络(CNN)已成为提高图像识别精度的核心工具。本文将探讨如何通过调整网络结构、增强训练数据集以及应用迁移学习等策略来优化CNN模型的性能。我们将分析这些方法的理论基础,并通过实验数据展示它们对提升图像分类任务性能的具体影响。
|
SQL 缓存 负载均衡
Web Security 之 HTTP Host header attacks(上)
Web Security 之 HTTP Host header attacks
1074 0
|
存储 芯片
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制
|
测试技术 C++ 编译器
|
开发框架 自然语言处理 开发者
多端/跨端/融合的桌面应用之Nw.js
NW.js作为一种基于Electron的桌面应用开发框架,以其出色的性能和可扩展性,深受广大开发者的喜爱。
429 0