React redux使用

news2024/12/27 1:40:40

1.redux是什么

redux是一个专门用于状态管理的JS库(不是react插件库)

它可以用在react,angular,vue等项目中,但基本与react配合使用

作用:集中式管理react应用中多个组件共享的状态

2.为什么要使用redux

某个组件的状态,需要让其他组件随时拿到(共享)

一个组件需要改变另一个组件的状态(通信)

总体原则:能不用就不能,如果不用比较吃力才考虑使用

3.redux怎么使用

 

redux的三个核心概念


(1)action


        A、动作对象

        B、包含两个属性

                type:标识属性,值为字符串,唯一,必要属性

                data:数据属性,值为任意类型,可选属性

                例如:{type: 'ADD_STUDENT ', data:{name:'tom', age:18}}

(2)reducer


        A、用于初始化状态,加工状态

        B、加工时根据旧的state和action,产生新的state的纯函数

(3)store


        A、将state,action, reducer联系在一起的对象

        B、如何得到此对象

import {createStore} from 'redux'
import reducer from './reducers'
const store = createStore(reducer)

        C、此对象的功能

                getState( ):得到state

                dispatch(action):分发action,触发reducer,产生新的state

                subscribe(listenr):注册监听,当产生新的state时,自动调用

求和案例—redux经典版

(1)去除Count组件自身的状态

(2)src下建立

        -src -rudex文件夹

                -store.js

                 -count_reducer.js

(3)store.js

 A、引入redux中的createStore函数,创建一个store

        B、createStore调用时要传入一个为其服务的reducer

        C、记得暴露store对象

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

(4)count_reducer.js

A、reducer的本质是一个函数,接收:PreState,action,返回加工后的函数

B、reducer有两个作用:初始化状态,加工状态

C、reducer第一次调用时,是store自动触发的,传递的preState是undefined

/*
 1.该文件用于创建一个为count组件服务的reducer,reducer的本质就是一个函数
 2.reducer函数会接到两个参数,分别是之前的state(状态)和action(动作对象)
*/
 
const initState = 0
export default function countReducer(preState=initState, action) {
  console.log(preState, action);
  //从action对象中获取type, data
  const {type, data} = action
  //根据type类型决定如何加工
  switch (type) {
    case 'increment':// 如果是加
     return preState + data
    case 'decrement':// 如果是减
      return preState - data
    default:
      return preState
 
 }
}

(5)在index.js中检测store中状态的改变,一旦发声改变重新渲染

备注:redux只负责状态管理,至于状态的改变驱动页面的展示,要靠我们自己

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App.jsx'
import store from './redux/store'
 
ReactDOM.render(<App/>,document.getElementById('root'))
 
store.subscribe(() => {
  ReactDOM.render(<App/>,document.getElementById('root'))
})

求和案例—redux完整版

新增文件

1.count_actions,js,专门用于创建action对象,本质是一个对象

2.constants.js,放置由于编码疏忽写错action中的type

count_action.js

/*
 该文件专门为count组件生成action对象
*/
 
import { INCREMENT, DECREMENT } from "./constant"
 
//完整写法
// function createIncrementAction(data) {
//   return {type:'increment', data }
// }
 
//简写形式
export const createIncrementAction = data =>( {type:INCREMENT, data })
 
//完整写法
// function createDecrementAction(data) {
//   return {type:'decrement', data}
// }
 
export const createDncrementAction = data =>( {type: DECREMENT, data })

constants.js

/*
 该文件是用于定义action对象中的type类型的常量值
 目的只有一个:防止程序员在编码的同时单次写错
*/
 
export const INCREMENT = 'increment'
 
export const DECREMENT = 'decrement'

完整代码示例

store.js

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

countReducer.js

/*
  1.该文件用于创建一个为count组件服务的reducer,reducer的本质就是一个函数
  2.reducer函数会接到两个参数,分别是之前的state(状态)和action(动作对象)
*/
import { INCREMENT, DECREMENT } from "./constant";
 
const initState = 0
export default function countReducer(preState=initState, action) {
  console.log(preState, action);
  //从action对象中获取type, data
  const {type, data} = action
  //根据type类型决定如何加工
  switch (type) {
    case INCREMENT:// 如果是加
     return preState + data
    case DECREMENT:// 如果是减
      return preState - data
    default:
      return preState
  }
}

constant.js

/*
  该文件是用于定义action对象中的type类型的常量值
  目的只有一个:防止程序员在编码的同时单次写错
*/
 
export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'

count_action.js

/*
  该文件专门为count组件生成action对象
*/
import { INCREMENT, DECREMENT } from "./constant"
//完整写法
// function createIncrementAction(data) {
//   return {type:'increment', data }
// }
//简写形式
export const createIncrementAction = data =>( {type:INCREMENT, data })
 
//完整写法
// function createDecrementAction(data) {
//   return {type:'decrement', data}
// }
export const createDncrementAction = data =>( {type: DECREMENT, data })

count-index.jsx

import React, { Component } from 'react'
//引入store,用于获取redux中获取的状态
import store from '../../redux/store'
//引入actionCreator,专门用于创建action对象
import { createIncrementAction, createDncrementAction} from '../../redux/count_action'
 
export default class Count extends Component {
  state = {carName:'奔驰c63'}//  把状态交给reducer之后组件也可以有自己独用的状态
 
  increment = () => {
    const {value} = this.selectNum
    store.dispatch(createIncrementAction(value*1))
  }
  decrement = () => {
    const {value} = this.selectNum
    store.dispatch(createDncrementAction(value*1))
  }
  incrementOdd = () => {
    const {value} = this.selectNum
    const count = store.getState()
    if(count % 2 !== 0) {
      store.dispatch(createIncrementAction(value*1))
    }
  }
  incrementWait = () => {
    const {value} = this.selectNum
    setTimeout(() => {
      store.dispatch(createIncrementAction(value*1))
    }, 1000)
  }
  render() {
    return (
      <div>
        <h1>当前求和为:{store.getState()}</h1>
        <select ref={c => {this.selectNum = c}}>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
        </select>&nbsp;
        <button onClick= {this.increment}>+</button>&nbsp;
        <button onClick= {this.decrement}>-</button>&nbsp;
        <button onClick= {this.incrementOdd}>当前求和为奇数再加</button>&nbsp;
        <button onClick= {this.incrementWait}>等一等再加</button>
      </div>
    )
  }
}

代码结构

 

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

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

相关文章

Windows命令行到底有多强大?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop。 欢迎大家投稿&#xff0c;提交issu…

高可用系列文章之三 - NGINX 高可用实施方案

前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn)高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX 高可用实施方案 高可用的实施, 主要步骤概述如下: NGINX 的安装及基础配置负载均衡层高可用: NGINX Keepali…

在BSV上运行深度神经网络

我们已经实现了一个用于手写数字分类的深度神经网络。已经训练好的模型完全在链上运行。它使用手写数字的 MNIST 数据集进行离线训练。该模型采用 28x28 灰度像素的图像并输出 0 到 9 的数字。 深度神经网络简介 人工神经网络是受生物神经网络启发而构建的。网络通过接触大量带…

[附源码]计算机毕业设计Python的小说阅读系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

智云通CRM:如何正确的提出报价?(一)

智云通CRM认为完成销售包括三个步骤&#xff1a;提出报价&#xff0c;解决最后问题&#xff0c;讨论下一步方案。 第一步是提出报价&#xff0c;首先我们讨论如何将提出报价。 在与客户讨论费用问题时&#xff0c;我们应当向客户提出两个不同报价&#xff0c;一个销售方案对应…

前缀和与差分算法

目录 一 前缀和 算法定义 算法分类 算法作用 一维前缀和 问题引入 暴力法&#xff1a; 前缀和法&#xff1a; 算法原理 问题解答 算法实践 江山白日梦 题目描述 题目解答 二维前缀和 问题引入 算法原理 问题解答 二 差分 算法定义 算法分类 算法作用 一…

torch.chunk与nn.Conv2d groups

torch.chunk 切分 假如特征x大小为&#xff1a;32x64x224x224 (BxCxHxW) q torch.chunk(x, 8, dim1) x是要切分的特征&#xff0c;8是要切分成几块&#xff0c;dim是指定切分的维度&#xff0c;这里等于1&#xff0c;就是按通道切分 就会将其按照通道&#xff0c;切分为8块&a…

【服务器数据恢复】服务器双循环riad5数据恢复案例

服务器数据恢复环境&#xff1a; 一台使用NTFS文件系统的服务器&#xff1b; 7块硬盘组成了一组raid5磁盘阵列。 服务器故障&初检&#xff1a; raid5磁盘阵列磁盘故障离线导致服务器瘫痪。用户在处理掉线磁盘时只添加新的硬盘rebuild&#xff0c;并没有将掉线的3块硬盘从阵…

CARLA在Windows上的安装与运行

0.写在前面 其实官方文档写的很详细&#xff0c;所有细节都有涉及&#xff0c;不过暂时没有中文版。本文写作目的&#xff0c;一个是作为自己的操作笔记&#xff0c;二个是帮助一些更习惯看中文版本的一些朋友 https://carla.readthedocs.io/en/latest/start_quickstart/ 这是…

Sentinel-1产品定义与产品格式(CSDN_0001_20220904)

&#xff08;文章编号&#xff1a;CSDN_0001_20220904&#xff09; 目录 1. 概述 1.1 地球物理测量 1.2 极化 1.3 干涉 2. 产品级别和产品类型 2.1 Level-0 2.2 Level-1 2.1.1 SLC 2.1.2 GRD 2.2 Level-2 3. 产品文件 3.1 组织结构 3.1.1 Annotation measuremen…

MySQL(十二):阿里巴巴 MySQL binlog 增量订阅消费Canal组件

https://github.com/alibaba/canal 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备Canal 服务器准备Canal Client测试 基于 Binlog实现跨系统实时数据同步 更换数据库实现比对和补偿程序 安全地实现数据备份和恢复 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备 查看当…

毫米波电路的PCB设计和加工(第一部分)

毫米波应用要点——相位精度受许多变量影响 从自动驾驶车辆上使用的防碰雷达系统到第五代&#xff08;5G&#xff09;高数据速率新无线&#xff08;NR&#xff09;网络技术&#xff0c;毫米波&#xff08;mmWave&#xff09;电路的应用领域正在快速增长。许多应用正在促进工作…

锐浪报表 Grid++Report 导出其它格式文件

锐浪报表 GridReport 导出其它格式文件 GridReport控件设计的报表&#xff0c;不仅可以打印&#xff0c;还可以导出8种格式的报表文件。 在GridReport的打印浏览中&#xff0c;有指定导出文件的对话框&#xff1a; 但是&#xff0c;软件的设计中&#xff0c;往往需要设计出&am…

黑*头条_第5章_延迟任务精准发布文章(新版)

黑*头条_第5章_延迟任务精准发布文章(新版) 文章目录黑*头条_第5章_延迟任务精准发布文章(新版)1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-l…

༺ཌ༈学编程到底学那种语言呢?༈ད༻

说到底&#xff0c;编程语言只是工具&#xff0c;就像螺丝刀一样。在需要使用圆头螺丝刀的时候&#xff0c;你就不能一意孤行使用一字螺丝刀。你需要根据实际的情况做决定。没有任何一种编程语言能够取代一切&#xff0c;成为终极编程语言。你需要根据当前岗位的要求&#xff0…

分布式数据库中间件Mycat介绍

从Cobar到Mycat&#xff0c;从闭源到开源&#xff0c;作为一个开源的分布式数据库中间件&#xff0c;Mycat已经被众多开源项目使用。本文简要介绍下Mycat的特性、基本架构以及分库分表和读写分离的配置。 1、Mycat基本介绍 Mycat是一个开源的分布式数据库中间件&#xff0c;前…

nodejs+vue044高校学生信息管理系统

大学生信息综合管理系统分三个身份登录&#xff0c;一个学生&#xff0c;一个管理员。学生只能修改密码&#xff0c;而管理员可以修改任何信息。老师可以查看自己的课表和校园活动. 管理员模块主要有老师管理&#xff0c;添加老师&#xff0c;班级管理&#xff0c;班级添加&…

[附源码]Python计算机毕业设计Django文具商城购物系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Educational Codeforces Round 140

C. Count Binary Strings 大意&#xff1a; 要求满足条件的01串的个数 要求如下 给定一个上三角矩阵&#xff0c;对于矩阵的元素i,j,a[i][j]有一下三个取值&#xff1a; 1&#xff1a;i-j之间只能有一种元素 2&#xff1a;i-j之间只能有两种元素 0: i-j之间无所谓 思路…

(Week 7)动态规划(C++)

目录[NOIP2005 普及组] 采药&#xff08;C&#xff0c;动态规划&#xff09;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路&#xff1a;最长上升子序列&#xff08;C&#xff0c;Dilworth&#xff0c;贪心&#xff09;题目描述输入格式输出格式样例 #1样…