当前位置: 首页 > news >正文

前端学习--React(3)

一、Redux

集中状态管理工具,不需要react即可使用,每个store的数据都是独立于组件之外的

vue小链接:vuex/pinia

基本使用

Redux将数据修改流程分成三个概念,state、action和reducer

state - 一个对象 存放我们管理的数据状态

action - 一个对象 描述你如何修改数据

reducer - 一个函数 根据action的描述生成新的state

<button id="decrement">-</button>
<span id="count">0</span>
<button id="increment">+</button><script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script><script>// 1. 定义reducer函数 // 作用: 根据不同的action对象,返回不同的新的state// state: 管理的数据初始状态// action: 对象 type 标记当前想要做什么样的修改function reducer (state = { count: 0 }, action) {// 数据不可变:基于原始状态生成一个新的状态 所以要返回新对象if (action.type === 'INCREMENT') {return { count: state.count + 1 }}if (action.type === 'DECREMENT') {return { count: state.count - 1 }}return state}// 2. 使用reducer函数生成store实例const store = Redux.createStore(reducer)// 3. 通过store实例的subscribe订阅数据变化// 回调函数可以在每次state发生变化的时候自动执行store.subscribe(() => {console.log('state变化了', store.getState())document.getElementById('count').innerText = store.getState().count})// 4. 通过store实例的dispatch函数提交action更改状态 const inBtn = document.getElementById('increment')inBtn.addEventListener('click', () => {// 增store.dispatch({type: 'INCREMENT'})})const dBtn = document.getElementById('decrement')dBtn.addEventListener('click', () => {// 减store.dispatch({type: 'DECREMENT'})})// 5. 通过store实例的getState方法获取最新状态更新到视图中</script>

react中使用redux

相关工具

Redux Toolkit 简化redux书写逻辑

react-redux 链接Redux和React的中间件

npm i @reduxjs/toolkit react-redux

 安装成功

目录创建

创建src/store,modules存放子模块

counterStore.js

//1 导入并创建store
import {createSlice} from "@reduxjs/toolkit"const counterStore = createSlice({name:'counter',// 初始状态initialState:{count:0},// 更新状态的方法reducers:{inscrement(state){state.count++},descrement(state){state.count --}}
})const {inscrement, descrement} = counterStore.actions
const reducer = counterStore.reducerexport{inscrement,descrement
}export default reducer

store/index.js

集成store/modules中所有子模块

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterStore"// 将子模块中的所有store合成一个根store方便访问
const store = configureStore({reducer:{counter:counterReducer,}
})export default store

src/index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from "./store"
import { Provider } from 'react-redux';const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(// 通过react-redux提供的Provider 给组件注入store 使得redux定义的store能够被react组件使用<Provider store={store}><App /></Provider>
);

App.js

useDispatch() 通过这个来派发reducer修改状态

import { useSelector, useDispatch } from "react-redux";
import {inscrement, descrement} from "./store/modules/counterStore"
function App() {const { count } = useSelector(state => state.counter)const dispatch = useDispatch()return (<div className="App"><button onClick={() => dispatch(inscrement())}>+</button>{count}<button onClick={() => dispatch(descrement())}>-</button></div>);
}export default App;

然后就完成了:

进阶版-提交action时传参

counterStore.js

增加了一个addToNum函数

//1 导入并创建store
import {createSlice} from "@reduxjs/toolkit"const counterStore = createSlice({name:'counter',// 初始状态initialState:{count:0},// 更新状态的方法reducers:{inscrement(state){state.count++},descrement(state){state.count --},addToNum(state, action){// dispatch调用该方法时传入的参数就存放在action.payloadstate.count += action.payload}}
})const {inscrement, descrement, addToNum} = counterStore.actions
const reducer = counterStore.reducerexport{inscrement,descrement,addToNum
}export default reducer

 App.js

增加了两个值,传入不同参数

import { useSelector, useDispatch } from "react-redux";
import {inscrement, descrement, addToNum} from "./store/modules/counterStore"
function App() {const { count } = useSelector(state => state.counter)const dispatch = useDispatch()return (<div className="App"><button onClick={() => dispatch(inscrement())}>+</button>{count}<button onClick={() => dispatch(descrement())}>-</button><button onClick={() => dispatch(addToNum(10))}>+ 10</button><button onClick={() => dispatch(addToNum(-10))}>- 10</button></div>);
}export default App;

再进阶版-异步状态操作

channelStore.js

import {createSlice} from '@reduxjs/toolkit'
import axios from 'axios'const channelStore = createSlice({name:'channel',initialState:{channelList:[]},reducers:{getChannels(state, action){state.channelList = action.payload}}
})const {getChannels} = channelStore.actions//单独写一个异步action的函数 异步操作处理完毕后再调用同步action修改状态
const getChannelList = () => {return async(dispatch) => {const res = await axios.get('http://geek.itheima.net/v1_0/channels')dispatch(getChannels(res.data.data.channels))}
}export {getChannelList}const reducer = channelStore.reducer
export default reducer

 App.js

import { useSelector, useDispatch } from "react-redux";
import {inscrement, descrement, addToNum} from "./store/modules/counterStore"
import {getChannelList} from "./store/modules/channelStore"
import {useEffect} from 'react'
function App() {const { count } = useSelector(state => state.counter)const { channelList } = useSelector(state => state.channel)const dispatch = useDispatch()useEffect(()=> {dispatch(getChannelList())}, [dispatch])return (<div className="App"><button onClick={() => dispatch(inscrement())}>+</button>{count}<button onClick={() => dispatch(descrement())}>-</button><button onClick={() => dispatch(addToNum(10))}>+ 10</button><button onClick={() => dispatch(addToNum(-10))}>- 10</button><ul>{channelList.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>);
}export default App;

调试工具redux devtools

直接在chorme商店里下载

 

相关文章:

前端学习--React(3)

一、Redux 集中状态管理工具&#xff0c;不需要react即可使用&#xff0c;每个store的数据都是独立于组件之外的 vue小链接&#xff1a;vuex/pinia 基本使用 Redux将数据修改流程分成三个概念&#xff0c;state、action和reducer state - 一个对象 存放我们管理的数据状态 a…...

rotation matrix reflection matrix

文章目录 1. rotation matrix1.1 结论 2. reflection matrix2.1 结论 1. rotation matrix 图像逆时针旋转 θ \theta θ的矩阵 Q r o t a t e [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] (1) Q_{rotate}\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\c…...

Python基础教程: sorted 函数

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作&#xff0c; sorted 方法返回的是一个新的 list&#xff0c;而不是在原来的基础上进行的操作。 从新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程…...

Vue 重写push和replace方法,解决:Avoided redundant navigation to current location

当我们使用编程式路由导航跳转路径时&#xff0c;如果我们两次携带同样的参数进行跳转&#xff0c;会进行页面报错&#xff1a; 那产生这个问题的原因是什么呢&#xff1f; 我们接收并输出调用push方法返回的结果&#xff1a; 会发现这是一个Promise对象 我们都知道&#xff…...

43、vue导出pdf文件,并解决滚动条外内容无法获取的问题

使用插件html2canvas和jspdf插件 下载完两个插件后引入所需要的页面 import html2canvas from "html2canvas" import jsPDF from "jspdf"1、在导出之前将元素的高度或者宽度设置为滚动高度或者宽度&#xff0c;如&#xff1a; el.style.height el.scro…...

牛客 最小公配数 golang版实现

题目请参考: HJ108 求最小公倍数 题解: 在大的数的倍数里面去找最小的能整除另外一个数的数&#xff0c;就是最小公倍数&#xff0c;按照大的来找&#xff0c;循环次数能够降到很少&#xff0c;提升效率 golang实现: package mainimport ("fmt" )func main() {a : …...

用 HLS 实现 UART

用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制&#xff0c;但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手&#xff0c;可以被视为本科生的作业。在这里&#xff0c;我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此&#xff0c;从概念上讲&#xf…...

华清远见嵌入式学习——网络编程——作业4

作业要求&#xff1a;①使用IO多路复用中的select函数实现TCP并发服务器客户端 ②使用IO多路复用中的poll函数实现TCP并发服务器的服务器端 一、 代码 #include <myhead.h>#define SERPORT 8888 //服务器端口号 #define SERIP "192.168.114.113"…...

【OpenCV实现图像:制作酷炫的动画效果】

文章目录 概要生成背景图添加点动画添加文本显示小结 概要 首先&#xff0c;通过导入必要的库&#xff0c;包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后&#xff0c;创建图形和轴&#xff0c;初始化点的位置&#xff0c;以及编写初始化函数和更新函数。 初始化函…...

CSS鼠标属性篇

属性名&#xff1a;cursor 功能&#xff1a;设置鼠标光标的样式 属性值&#xff1a; pointer&#xff1a;小手move&#xff1a;移动图标text&#xff1a;文字选择器crosshair&#xff1a;十字架wait&#xff1a;等待help&#xff1a;帮助 eg.html{ cursor: wait;}(此处使用css改…...

交直流一体化电源系统测试步骤详解

交直流一体化电源拥有高度适应性&#xff0c;可以用于不同的电力需求领域。但是为了确保其质量和性能&#xff0c;需要对交直流一体化电源进行各项测试以保证正常工作。本文纳米软件将介绍交直流一体化电源的测试方法&#xff0c;以及如何用交直流一体化电源测试系统进行测试。…...

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程&#xff1a; django-apscheduler基本使用 1.安装django-apscheduler代码如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下&#xff08;示例&#xff09…...

SPS简单对应分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…...

智能井盖传感器建设信息化时代智慧城市

近年来随着信息技术的快速发展和城市化进程的加速推进&#xff0c;智慧城市的概念逐渐成为现实。作为智慧城市生命线建设中的重要组成部分&#xff0c;智能井盖传感器的应用正在为城市的可持续发展和居民的生活质量提供新的解决方案。 智能井盖传感器能够实时监测井盖状态&…...

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…...

量子计算概述

目录 1.量子计算介绍 2.量子计算应用 3.量子计算研究机构 1.量子计算介绍 量子计算是一种遵循量子力学规律调控量子信息单元进行计算的新型计算模式。经典计算使用2进制进行运算&#xff0c;但2进制只有0和1两种状态&#xff0c;而量子计算除了包含0和1两种状…...

校园圈子论坛,交友,帖子内短视频,二手市场,APP小程序H5三端交付,源码交付,支持二开

校园圈子论坛&#xff0c;交友频道&#xff0c;商城&#xff0c;二手市场&#xff0c;活动专区&#xff0c;短视频&#xff0c;从校园生活的方方面面展现出了充满活力和创造力的镜头。这个频道是一个让学生们相互交流、结识新朋友的平台&#xff0c;不仅有交友功能&#xff0c;…...

Request 爬虫的 SSL 连接问题深度解析

SSL 连接简介 SSL&#xff08;Secure Sockets Layer&#xff09;是一种用于确保网络通信安全性的加密协议&#xff0c;广泛应用于互联网上的数据传输。在数据爬取过程中&#xff0c;爬虫需要与使用 HTTPS 协议的网站进行通信&#xff0c;这就牵涉到了 SSL 连接。本文将深入研究…...

gin相关操作--一起学习921190764

gin官方文档 https://gin-gonic.com/docs/quickstart/1. 安装 go get -u github.com/gin-gonic/ginhttps://github.com/gin-gonic/gin简单入门 package mainimport ("github.com/gin-gonic/gin""net/http" )func pong(c *gin.Context) {//c.JSON(http.S…...

Linux查看开机启动的服务

在Linux系统中&#xff0c;可以使用不同的命令和工具来查看开机启动的服务。以下是一些常用的方法&#xff1a; systemctl 命令&#xff1a; 使用 systemctl 命令可以查看系统中所有正在运行的服务以及它们的状态。 systemctl list-units --typeservice若要查看某个特定服务的…...

PMC Organometallix宣布所有产品提价

鉴于市场环境发生重大变化&#xff0c;PMC Organometallix, Inc. 宣布&#xff0c;自2026年5月1日起&#xff08;或根据合同条款允许的时间&#xff09;&#xff0c;全球所有产品线的价格将上调10%至25%。此次调整源于关键投入成本的持续压力&#xff0c;包括原材料成本上涨以及…...

量子机器学习中的浅层电路监督学习实践

1. 量子机器学习中的浅层电路监督学习实践量子计算与机器学习的交叉领域近年来发展迅猛&#xff0c;但实际应用仍面临两大核心挑战&#xff1a;经典数据的高效量子编码和浅层量子电路的可训练性。作为一名长期跟踪量子计算发展的从业者&#xff0c;我将分享一种基于线性哈密顿量…...

YOLOv5/v8炼丹必备:手把手教你插入SE、CBAM、ECA模块,实测mAP提升技巧

YOLOv5/v8模型优化实战&#xff1a;SE、CBAM、ECA注意力模块集成指南与效果对比 在目标检测领域&#xff0c;YOLO系列模型因其出色的速度和精度平衡而广受欢迎。然而&#xff0c;在实际工业应用中&#xff0c;我们常常需要在保持实时性的前提下进一步提升检测精度。注意力机制作…...

Demucs-GUI音乐分离工具终极指南:零基础到专业级音频处理

Demucs-GUI音乐分离工具终极指南&#xff1a;零基础到专业级音频处理 【免费下载链接】Demucs-Gui A GUI for music separation AI demucs 项目地址: https://gitcode.com/gh_mirrors/de/Demucs-Gui 想要将歌曲中的人声、鼓点、贝斯等元素完美分离出来吗&#xff1f;Dem…...

gptree:高效向AI助手提供项目上下文的命令行工具

1. 项目概述&#xff1a;为什么我们需要 gptree&#xff1f;如果你和我一样&#xff0c;日常开发中重度依赖像 ChatGPT、Claude、Cursor 这类 AI 编程助手&#xff0c;那你肯定遇到过这个痛点&#xff1a;如何高效地把整个项目的上下文喂给 AI&#xff1f;复制粘贴单个文件太零…...

终极Windows 11优化指南:如何使用Win11Debloat让你的系统更快更干净

终极Windows 11优化指南&#xff1a;如何使用Win11Debloat让你的系统更快更干净 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to dec…...

MIT破解AI黑盒-稀疏自编码器自动提取可解释概念

MIT 破解 AI 黑盒&#xff1a;用稀疏自编码器自动提取"可解释概念"标签&#xff1a;AI可解释性、XAI、计算机视觉、稀疏自编码器、医疗AI、概念瓶颈模型一个皮肤病变识别模型&#xff0c;给出了"恶性"的判断&#xff0c;但医生不知道它依据了什么特征——这…...

3步搞定Notion风格编辑器Novel:打造你的AI写作神器

3步搞定Notion风格编辑器Novel&#xff1a;打造你的AI写作神器 【免费下载链接】novel Notion-style WYSIWYG editor with AI-powered autocompletion. 项目地址: https://gitcode.com/gh_mirrors/no/novel 还在为寻找一款既美观又强大的开源编辑器而烦恼吗&#xff1f;…...

工业级触控面板电脑ACP-1078核心技术解析与应用

1. AAEON ACP-1078工业级触控面板电脑深度解析在制造业和物流行业的数字化转型浪潮中&#xff0c;工业级HMI&#xff08;人机界面&#xff09;设备正扮演着越来越关键的角色。AAEON&#xff08;研扬科技&#xff09;最新推出的ACP-1078触控面板电脑&#xff0c;凭借其Rockchip …...

【DOA估计】基于均匀圆阵相干信号二维doa估计Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...