一、【redux】redux简介 mini版求和Demo

news2024/11/26 18:48:08

文章目录

  • 1、学习文档
  • 2、redux是什么
  • 3、什么情况下需要使用redux
  • 4、redux工作流程
  • 5、redux的三个核心概念
    • 5.1、action
    • 5.2、reducer
    • 5.3、store
  • 6、redux的核心API
    • 6.1、createStore()
    • 6.2、store对象
    • 6.3、applyMiddleware()
    • 6.4、combineReducers()
  • 7、求和Demo(纯react版)
    • 7.1、实现效果
    • 7.2、CODE
    • 7.3、Result
  • 8、求和Demo(reudx mini版)
    • 8.1、Redux mini 示意图
    • 8.2、操作详解
    • 8.3、项目结构
    • 8.4、CODE
      • 8.4.1、count_reducer.js
      • 8.4.2、store.js
      • 8.4.3、Count_Redux.jsx
    • 8.5、Result

1、学习文档

  1. 英文文档
  2. 印记中文-redux中文文档(维护较新)
  3. 中文文档(Old)
  4. Github

2、redux是什么

  1. redux是一个专门用于做状态管理的JS库(不是react插件库)
  2. 它可以用在react, angular, vue等项目中, 但基本与react配合使用
  3. 作用: 集中式管理react应用中多个组件共享的状态

3、什么情况下需要使用redux

  1. 某个组件的状态,需要让其他组件可以随时拿到(共享)
  2. 一个组件需要改变另一个组件的状态(通信)
  3. 总体原则:能不用就不用, 如果不用比较吃力才考虑使用

4、redux工作流程

在这里插入图片描述

5、redux的三个核心概念

5.1、action

  1. 动作的对象
  2. 包含2个属性
    1. type:标识属性, 值为字符串, 唯一, 必要属性
    2. data:数据属性, 值类型任意, 可选属性
  3. 例子:{ type: 'ADD_STUDENT',data:{name: 'tom',age:18} }

5.2、reducer

  1. 用于初始化状态、加工状态
  2. 加工时,根据旧的state和action, 产生新的state的纯函数

5.3、store

  1. 将state、action、reducer联系在一起的对象
  2. 如何得到此对象
    1. import {createStore} from 'redux'
    2. import reducer from './reducers'
    3. const store = createStore(reducer)
  3. 此对象的功能?
    1. getState():得到state
    2. dispatch(action):分发action, 触发reducer调用, 产生新的state
    3. subscribe(listener):注册监听, 当产生了新的state时, 自动调用

6、redux的核心API

6.1、createStore()

  • 作用:创建包含指定reducer的store对象

6.2、store对象

  1. 作用: redux库最核心的管理对象
  2. 它内部维护着:
    1. state
    2. reducer
  3. 核心方法:
    1. getState()
    2. dispatch(action)
    3. subscribe(listener)
  4. 具体编码:
    1. store.getState()
    2. store.dispatch({type:'INCREMENT', number})
    3. store.subscribe(render)

6.3、applyMiddleware()

  • 作用:应用上基于redux的中间件(插件库)

6.4、combineReducers()

  • 作用:合并多个reducer函数

7、求和Demo(纯react版)

7.1、实现效果

在这里插入图片描述

7.2、CODE

import React, { Component } from 'react'

export default class Count extends Component {
    state = {
        sum: 0,
        num: 1
    }

    add = () => {
        const { sum, num } = this.state
        this.setState({ sum: sum + num })
    }

    sub = () => {
        const { sum, num } = this.state
        this.setState({ sum: sum - num })
    }

    oddAdd = () => {
        const { sum, num } = this.state
        if (sum % 2 === 1) {
            this.setState({ sum: sum + num })
        }
    }

    asyncAdd = () => {
        const { sum, num } = this.state
        setTimeout(() => {
            this.setState({ sum: sum + num })
        }, 2000)
    }

    render() {
        const { sum } = this.state
        return (
            <div>
                <h1>当前求和为:{sum}</h1>

                <select onChange={e => { this.setState({ num: e.target.value - 0 }) }}>
                    <option value={1}>1</option>
                    <option value={2}>2</option>
                    <option value={3}>3</option>
                </select>
                &nbsp;&nbsp;
                <button onClick={this.add}>+</button>&nbsp;&nbsp;
                <button onClick={this.sub}>-</button>&nbsp;&nbsp;
                <button onClick={this.oddAdd}>奇数+</button>&nbsp;&nbsp;
                <button onClick={this.asyncAdd}>延迟+</button>
            </div >
        )
    }
}

7.3、Result

在这里插入图片描述

8、求和Demo(reudx mini版)

redux安装指令:yarn add reduxnpm i redux

8.1、Redux mini 示意图

在这里插入图片描述

8.2、操作详解

  1. 去除Count组件自身的状态
  2. src下建立:
    1. redux
      1. store.js
      2. count_reducer.js
  3. store.js
    1. 引入redux中的createStore函数,创建一个store
    2. createStore调用时要传入一个为其服务的reducer
    3. 记得暴露store对象
  4. count_reducer.js
    1. reducer的本质是一个函数,接收:preState,action,返回加工后的状态
    2. reducer有两个作用:初始化状态,加工状态
    3. reducer被第一次调用时,是store自动触发的
      1. 传递的preState是undefined
      2. 传递的action是:{type:'@@REDUX/INIT_a.2.b.4}
  5. 在index.js中监测store中状态的改变,一旦发生改变重新渲染<App/>
    1. 备注:redux只负责管理状态,至于状态的改变驱动着页面的展示,要靠我们自己写

8.3、项目结构

在这里插入图片描述

8.4、CODE

8.4.1、count_reducer.js

/**
 * 1、该文件是为了创建一个为Count组件服务的reducer
 *      reducer本质就是一个函数
 * 2、reducer会接到两个参数
 *      - preState:之前的状态
 *      - action:动作对象
 */
export default function countReducer(preState = 0, action) {
    // 从action中获取type/data
    const { type, data } = action
    // 根据type判断如何加data
    switch (type) {
        case 'increment': // +
            return preState + data
        case 'decrement': // -
            return preState - data
        default:
            return preState
    }
}

8.4.2、store.js

/* 
    该文件专门用于暴露一个store对象,整个应用只有一个store对象
*/

//引入createStore,专门用于创建redux中最为核心的store对象
import { createStore } from 'redux'
//引入为Count组件服务的reducer
import countReducer from './count_reducer'
//暴露store
export default createStore(countReducer)

8.4.3、Count_Redux.jsx

import React, { Component } from 'react'
// 引入store,用于获取redux中维护的状态
import store from '../../redux/store'

export default class Count extends Component {
    state = {
        num: 1
    }

    componentDidMount() {
        // 监测redux的状态,变化触发render
        store.subscribe(() => {
            // redux状态改变就会调这个回调
            this.setState({})
        })
       	// 注:这个监测可挂在入口文件上,这样就不用每个组件都写一遍了
    }

    add = () => {
        const { num } = this.state
        store.dispatch({
            type: 'increment',
            data: num
        })
    }

    sub = () => {
        const { num } = this.state
        store.dispatch({
            type: 'decrement',
            data: num
        })
    }

    oddAdd = () => {
        const { num } = this.state
        if (store.getState() % 2 === 1) {
            store.dispatch({
                type: 'increment',
                data: num
            })
        }
    }

    asyncAdd = () => {
        const { num } = this.state
        setTimeout(() => {
            store.dispatch({
                type: 'increment',
                data: num
            })
        }, 2000)
    }

    render() {
        return (
            <div>
                <h1>当前求和为:{store.getState()}</h1>

                <select onChange={e => { this.setState({ num: e.target.value - 0 }) }}>
                    <option value={1}>1</option>
                    <option value={2}>2</option>
                    <option value={3}>3</option>
                </select>
                &nbsp;&nbsp;
                <button onClick={this.add}>+</button>&nbsp;&nbsp;
                <button onClick={this.sub}>-</button>&nbsp;&nbsp;
                <button onClick={this.oddAdd}>奇数+</button>&nbsp;&nbsp;
                <button onClick={this.asyncAdd}>延迟+</button>
            </div >
        )
    }
}

8.5、Result

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拖死项目的不是团队,可能是失败的管理

项目中的活动&#xff0c;归根结底是由人来完成的&#xff0c;如何发挥项目成员的能力&#xff0c;对于项目的成败起着至关重要的作用。如何充分地发挥团队成员的能力&#xff0c;对项目经理也是一个挑战。 在团队管理者我们会遇见这些难题&#xff1a; 1、团队凝聚力不足&a…

配置CentOS

一、启动虚拟机 1、登录虚拟机 出现[rootlocalhost]#提示符&#xff0c;表明登录成功 2、查看IP 命令&#xff1a; ip addr 3、是否ping通外网 命令&#xff1a;ping www.baidu.com 二、配置静态IP地址 1、修改网卡配置文件 命令&#xff1a;vi /etc/sysconfig/net…

UBoot怎么跳转到Kernel:uboot与linux的交界

不知道你是否有这种感觉&#xff0c;就是学习了一段时间Uboot&#xff0c;学习了一段时间kernel&#xff0c;也知道Uboot是引导程序。但是总是连不起来。 我为什么来的这样的感受是因为&#xff0c;我最近在学习安全相关的东西。但是这个安全的东西应用在kernel里面进行&#…

路径规划算法之刚体变换

目录 1 一般概念 1.1 基元的变换 1.2 一个参数化的变换族 2 2D变换 2.1 translation 2.2 rotation 2.3 Combining translation and rotation 3 3D变换 3.1 Yaw, pitch, and roll rotations 3.2 Determining yaw, pitch, and roll from a rotation matrix 3.3 The ho…

模拟电路设计(35)---几种脉宽调制型开关电路

Forward单端正激变换器 在buck变换器开关与负载之间插入隔离变压器&#xff0c;这种隔离型buck变换器叫做Forward单端正激变换器。如下图所示&#xff1a; Forward单端正激变换器 简单分析可知&#xff0c;滤波电感L在开关管关断期间&#xff0c;通过续流二极管为负载提供电流…

Android JNI编程并生成so库

这里写自定义目录标题Android JNI编程并生成so库Android Studio配置下载配置NDK配置NDK路径编写native方法和c文件编写配置文件生成so库使用so库Android JNI编程并生成so库 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编…

Python——字符串

1、再Python中&#xff0c;使用单引号或者双引号括起来的&#xff0c;就是字符串 2、字符串也可以使用六个单引号或者六个双引号括起来。 3、在Python3中&#xff0c;字符串分为两种类型&#xff0c;第一种是str&#xff0c;是unicode字符串&#xff0c;第二种是bytes&#x…

springboot酒店客房管理系统设计

随着我国市场经济的快速发展以及人们生活水平的不断提高&#xff0c;酒店&#xff0c;宾馆之间的竞争也越来越激烈&#xff0c;为了在这场竞争中取得显著的优势&#xff0c;就必须在管理上加以改善。在某种意义上&#xff0c;酒店客房方面的信息化已经成为现代化酒店的重要标志…

Python学习笔记第三十七天(NumPy 广播(Broadcast))

Python学习笔记第三十七天NumPy 广播(Broadcast)NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式&#xff0c; 对数组的算术运算通常在相应的元素上进行。 如果两个数组 a 和 b 形状相同&#xff0c;即满足 a.shape b.shape&…

gurobi 基于python的gurobipy库使用,具有一维变量和二维变量的复杂模型求解

写在前面 可以参考下pulp和scip两篇的&#xff0c;比较详细&#xff0c;尤其pulp篇。举一反三&#xff0c;很好入门。 步骤 定义问题&#xff1a;m Model(name) 定义变量&#xff1a;x m.addVars(range(len), vtypeGRB.BINARY) 定义目标函数&#xff1a;m.setObjective&…

Springboot+ssm(Spring+SpringMVC+MyBatis)旧物置换网站

目 录 摘 要 I 目 录 III 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 Java技术介绍 4 2.2.3 mysql数据库介绍 4 2.2.4 …

【Electron】开发实战

文章目录第一章 征程第二章-主进程与渲染进程第三章-H5拖拽读取本地文件第四章-快捷键注册及复制粘贴第五章-渲染进程调用主进程模块第六章-菜单模块第七章-渲染进程与主进程间的通信第八章-渲染进程与渲染进程间的通信第九章-管理应用程序文件及url的加载方式第十章-系统对话框…

机械硬盘HDD

硬盘&#xff08;英语&#xff1a;Hard Disk Drive&#xff0c;缩写&#xff1a;HDD&#xff0c;有时为了与固态硬盘相区分称“机械硬盘”或“传统硬盘”&#xff09;是电脑上使用坚硬的旋转盘片为基础的非易失性存储器&#xff0c;它在平整的磁性表面存储和检索数字数据&#…

三维重建之PIFuHD

Fackbook AI 研究出从一张图片生成Mesh模型的算法PIFuHD ​ Paper: https://arxiv.org/pdf/2004.00452.pdf Code: https://github.com/facebookresearch/pifuhd 一&#xff0c;Demo数据预处理 这里面需要先编译pifuhd和lightweight-human-pose-estimation.pytorch&#xf…

Unknown custom element: <el-image>无法使用该组件,升级element-ui版本后项目报错

需求背景&#xff1a; 项目中需要使用图片点击放大&#xff0c;想要使用<el-image>组件&#xff0c;引入后报了下面的错&#xff0c;需要升级element版本&#xff0c;element-ui版本过低&#xff0c;没有该组件。 过程&#xff1a; cnpm i element-ui2.14.1 --save-dev…

代码随想录67——额外题目【动态规划】:5最长回文子串、132分割回文串II、673最长递增子序列的个数

文章目录1.5最长回文子串1.1.题目1.2.解答2.132分割回文串II2.1.题目2.2.解答3.673最长递增子序列的个数3.1.题目3.2.解答1.5最长回文子串 参考&#xff1a;代码随想录&#xff0c;5最长回文子串&#xff1b;力扣题目链接 1.1.题目 1.2.解答 本题和 647.回文子串 差不多是一…

Codeforces Round #574 (Div. 2) C. Basketball Exercise

翻译&#xff1a; 最后&#xff0c;SIS已经开放了一个篮球场&#xff0c;所以Demid决定举办一个篮球训练课程。有2个⋅&#x1d45b;的学生参加了Demid的练习课&#xff0c;他将他们排成两排&#xff0c;大小相同(每排正好有&#x1d45b;人)。学生按从左到右的顺序&#xff0…

【毕业设计】15-基于单片机的交通灯系统设计(原理图+仿真+论文)

【毕业设计】15-基于单片机的交通灯系统设计&#xff08;原理图、仿真、源代码工程答辩论文答辩PPT&#xff09; 文章目录【毕业设计】15-基于单片机的交通灯系统设计&#xff08;原理图、仿真、源代码工程答辩论文答辩PPT&#xff09;任务书设计说明书摘要设计框架架构设计说明…

婴幼儿牛奶蛋白过敏危害多,教你四招早期预防

牛奶蛋白过敏&#xff08;cowsmilkproteinallergy&#xff0c;CMPA&#xff09;这是婴幼儿最常见的食物过敏之一。牛奶蛋白过敏的临床表现CMPA儿童的临床表现多种多样[1]&#xff0c;特别是对严重的牛奶蛋白过敏&#xff0c;会导致拒绝进食、腹泻、呕吐或反流&#xff0c;导致生…

CentOS7安装superset2.0

备注&#xff1a;自己在CentOS7.5下安装superset2.0成功。数据库以本地sqlite为准。Superset是由Python语言编写的Web应用&#xff0c;Superset2.0版本要求Python3.9的环境。 1、安装Miniconda 原因&#xff1a;conda是一个开源的包、环境管理器&#xff0c;可以用于在同一个…