【react】Redux基础用法

news2024/11/27 10:36:16

1. Redux基础用法

Redux 是一个用于 JavaScript 应用的状态管理库,它不依赖于任何 UI库,但常用于与 React 框架配合使用。它提供了一种集中式的状态管理方式,将应用的所有状态保存在一个单一的全局 Store(存储)中,使得状态的变化和共享变得更加可控和可预测。

Redux 的核心概念:

  • Store
    Redux 的 Store 是一个对象,存储了应用的全部状态。应用中只有一个 Store,作为单一数据源。任何组件需要访问状态时都会从这个 Store 中获取数据。

  • Action
    Action 是一个简单的 JavaScript 对象,用**来描述要执行的状态变化。**它通常包含两个部分:type(字符串,描述 Action 的类型)和 payload(可选,用来传递需要修改的数据信息)。Action 是 Redux 中唯一触发状态更新的方式。

  • Reducer
    Reducer 是一个纯函数,定义了应用在接收到不同 Action 时如何更新状态。它接收当前的状态和 Action,返回一个新的状态对象。

  • Dispatch
    Dispatch 是 Redux 中触发 Action 的方法。调用 store.dispatch(action) 可以将 Action 发送到 Store,从而触发 Reducer 更新状态。

  • Selectors
    Selectors 是从 Store 中获取特定状态的函数,主要用于简化和集中获取逻辑,避免直接访问 Store 造成的代码冗余。

  • Middleware
    Redux 中间件是在 dispatch 和 reducer 之间的一个逻辑层,可以用于处理异步操作(如 redux-thunk)或记录状态变化(如 redux-logger)。中间件增强了 Redux,使其能够处理复杂的逻辑和副作用。

简单计数器案例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<script src="https://cdn.bootcdn.net/ajax/libs/redux/4.2.0/redux.min.js"></script>


<body>
    <button id="increment">+</button>
    <span id="count">0</span>
    <button id="decrement">-</button>
</body>

<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对象的dispatch,修改store中的数据
    const inBtn = document.getElementById('increment')
    const deBtn = document.getElementById('decrement')
    inBtn.addEventListener('click', () => {
        store.dispatch({ type: 'INCREMENT' })
    })
    deBtn.addEventListener('click', () => {
        store.dispatch({ type: 'DECREMENT' })
    })

    // 4. 监听store中数据的变化
    //每次state发生变化的时候自动执行
    store.subscribe(() => {
        console.log('store数据变化了', store.getState())
        document.getElementById('count').innerText = store.getState().count
    })
</script>
</html>

2. React中使用Redux

在React中使用redux,官方要求安装俩个其他插件-ReduxToolkitreact-redux

  1. Redux Toolkit(RTK): 官方推荐编写Redux逻辑的方式,是一套工具的集合,简化书写方式
  2. react-redux:用来 链接 Redux和 React组件的中间件
npm install @reduxjs/toolkit react-redux

目录结构:新建store文件夹,将子模块放在modules目录下,index.js为store入口文件。

创建 slice 需要一个字符串名称来标识 slice,一个初始 state 值,以及一个或多个 reducer 函数来定义如何更新 state。创建 slice 后,我们可以导出生成的 Redux action creators 和整个 slice 的 reducer 函数。

/store/modules/counterStore.js

import {createSlice} from '@reduxjs/toolkit'

const counterSlice = createSlice({
    // 标识 slice的字符串名称
    name:'counter',
    // 初始化state
    initialState:{
        count:0
    },
    // 修改state的方法(同步方法
    reducers:{
        increment(state,action){
        // 修改时的传参会放在ction.payload属性上
            state.count += action.payload
        },
        decrement(state,action){
            state.count -= action.payload
        }
    }
})

// 从 counterSlice.actions中解构
export  const {increment,decrement} = counterSlice.actions
export default counterSlice.reducer

接下来,我们需要从 counter slice 中导入 reducer 函数,并将其添加到我们的 store 中。通过在 reducer 参数中定义一个字段,我们告诉 store 使用这个 slice reducer 函数来处理对该状态的所有更新。

/store/index.js

import { configureStore } from "@reduxjs/toolkit";

// 导入子模块reducer
import counterReducer from "./modules/counterStore";
// 通过configureStore来创建一个store
const store =configureStore({
  reducer: {
    counter: counterReducer,
  },
});
export default store

提供store
导入我们刚刚创建的 Redux store,在你的 <App> 周围放一个 <Provider>,然后将 store 作为 prop 传递

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { Provider } from "react-redux";
import store from "./store";

// 将App组件渲染到id为root的DOM元素中
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

读取store中的数据: 使用useSelector函数

修改store中的数据: 使用useDispatch函数,并根据需要 dispatch action

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

export default App;

异步请求操作:

  1. 创建store的写法保持不变,配置好同步修改状态的方法
  2. 单独封装一个函数,在函数内部return一个新函数,在新函数中
    2.1 封装异步请求获取数据
    2.2 调用同步actionCreater传入异步数据生成一个action对象,并使用dispatch提交

/store/modules/sentenceStore.js

import { createSlice } from "@reduxjs/toolkit";
// 先安装npm i axios
import axios from "axios";

const sentenceSlice = createSlice({
  name: "sentence",
  initialState: {
    sentence: {},
  },
  reducers: {
    setSentence(state, action) {
      state.sentence = action.payload;
    },
  },
});
const { setSentence } = sentenceSlice.actions;
// 获取异步请求数据
const getSentence = () => {
  return async (dispatch) => {
    const { data } = await axios.get("https://api.xygeng.cn/one");
    dispatch(setSentence(data.data));
  };
};
export { getSentence };    
export default sentenceSlice.reducer;

/store/index.js

import { configureStore } from "@reduxjs/toolkit";

// 导入子模块reducer
import counterReducer from "./modules/counterStore";
import sentenceReducer from "./modules/sentenceStore";

const store = configureStore({
  reducer: {
    counter: counterReducer,
    sentence: sentenceReducer,
  },
});
export default store;

3.组件中dispatch的写法保持不变

import { useDispatch, useSelector } from "react-redux";
import { increment, decrement } from "./store/modules/counterStore";
import { getSentence } from "./store/modules/sentenceStore";
import { useEffect } from "react";
function App() {
  const { count } = useSelector((state) => state.counter);
  const { sentence } = useSelector((state) => state.sentence);

  // 通过dispatch触发action,来更新state状态
  const dispatch = useDispatch();
  // 使用useEffect触发异步请求
  useEffect(() => {
    dispatch(getSentence());
  }, [dispatch]);

  return (
    <div>
      <button onClick={() => dispatch(decrement(1))}>-</button>
      {count}
      <button onClick={() => dispatch(increment(1))}>+</button>
      <div>
        {" "}
        {sentence.content}--{sentence.name}
      </div>
    </div>
  );
}

export default App;

👻Redux 官网教程

3. Redux调试工具

google商城里搜索:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

VMware虚拟机Debian扩展磁盘

一、 版本 VMware&#xff1a;Workstation 17 Pro虚拟机&#xff1a;Debian11 二、 VMware虚拟机扩展 虚拟机关机状态快照或者备份&#xff1a;以免扩容失败导致文件丢失虚拟机——设置——硬盘——磁盘使用工具——扩展——扩展磁盘容量——设置为想要的大小 三、 虚拟机…

软件设计师-上午题-16 算法(4-5分)

算法题号一般为62-65题(数据结构与算法题号为57-65&#xff0c;共9分)&#xff0c;分值一般为4-5分。 目录 1 回溯法 1.1 N皇后问题 1.2 非递归求解N皇后问题 1.3 递归求解N皇后问题 1.4 真题 2 分治法 2.1 最大字段和问题 2.2 真题 3 动态规划 3.1 0-1背包问题 3.…

【react如何在chrome浏览器里面调试?】

react如何在chrome浏览器里面调试&#xff1f; 1. 首先在在工作区关联源码 2. 安装react的chrome插件。 3. 切换到插件的标签&#xff0c;然后选中你要调试的页面元素&#xff0c;再点击右边的按钮&#xff0c;切换到对应的源码 4. 可以在源码任意位置打断点运行。

【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】

Mysql NDB Cluster 集群(CentOS 7)安装笔记 NDB集群核心概念 NDBCLUSTER(也称为NDB)是一个内存存储引擎,提供高可用性和数据保存功能。 NDBCLUSTER存储引擎可以配置一系列故障转移和负载平衡选项,但从集群级别的存储引擎开始是最容易的。NDB集群的NDB存储引擎包含一整套…

在Microsoft Outlook日历中添加多个时区

在Microsoft Outlook日历中添加多个时区 1.单击Outlook中的文件选项卡&#xff0c;单击选项 2.左侧菜单中选择日历 3.向下滚动到时区部分&#xff0c;并标记当前时区&#xff0c;比如China 4.选中“显示第二个时区”框 5.选择第二个时区并给它一个标签&#xff0c;比如Germa…

考公人数攀升?地信、测绘、地质、遥感等专业,能报考哪些单位

近年来&#xff0c;考公人数持续飙升&#xff0c;国考报名人数更逐年攀升。2025年国家公务员考试共有341.6万人通过资格审查&#xff0c;报录比达86:1。国考报名人数再创新高。 国家公务员考试时间安排 地理学相关岗位分析 地信属于地理科学类&#xff0c;测绘类中不包括地信&…

大华乐橙设备私有平台EasyCVR视频设备轨迹回放平台支持哪些摄像机?摄像机如何选型?

在现代安全监控系统中&#xff0c;视频监控设备扮演着至关重要的角色。视频设备轨迹回放平台EasyCVR以其卓越的兼容性和灵活性&#xff0c;支持接入多种品牌和类型的摄像机。这不仅为用户提供了广泛的选择空间&#xff0c;也使得视频监控系统的构建和管理变得更加高效和便捷。本…

PyCharm中pylint安装与使用

目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是&#xff0c;得到10分/ 满分10分&#xff0c;上次运行获得8.33分&#xff0c;经调整…

客户服务数据分析:洞察客户需求,优化服务策略

在数字经济时代&#xff0c;数据已成为企业决策的重要依据。特别是在客户服务领域&#xff0c;通过深度挖掘和分析客户服务数据&#xff0c;企业能够更精准地洞察客户需求&#xff0c;优化服务策略&#xff0c;从而提升客户满意度和忠诚度&#xff0c;增强市场竞争力。 一、客户…

【Python】Python自习课:第一个python程序

【Python】Python自习课&#xff1a;第一个python程序 示例

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

ONLYOFFICE 8.2版本产品评测——遥遥领先,助力自动化办公

ONLYOFFICE 产品测试体验报告总结 知孤云出岫-CSDN博客 目录 产品介绍——篇【1】 一.关于 ONLYOFFICE 桌面编辑器 二.关于 ONLYOFFICE 协作空间 三.关于 ONLYOFFICE 文档 四.关于 ONLYOFFICE的版本介绍 产品新功能——篇【2】 一.关于 ONLYOFFICE的新增功能介绍 二.ONL…

[vulnhub]DC: 1

https://www.vulnhub.com/entry/dc-1,292/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是156 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-28 12:48 CST Nmap scan rep…

人脑与机器连接:神经科技的伦理边界探讨

内容概要 在当今科技飞速发展的时代&#xff0c;人脑与机器连接已成为一个引人注目的前沿领域。在这一背景下&#xff0c;神经科技的探索为我们打开了一个全新的世界&#xff0c;从脑机接口到人工智能的飞跃应用&#xff0c;不仅加速了技术的进步&#xff0c;更触动了我们内心…

Visual Studio | 配置管理

文章目录 一、配置管理1、项目属性1.1、常规1.2、VC 目录1.3、C/C -> 常规1.4、C/C -> 预处理器1.5、C/C -> 预编译头1.6、连接器 -> 常规1.7、连接器 -> 输入 2、编辑2.1、显示空格或tab符 一、配置管理 1、项目属性 1.1、常规 字段功能目标平台版本用于生成…

如何将VMware ESXi中的虚拟机迁移到Workstation

我们前面介绍了如何将VMware workstation中的虚拟机迁移到ESXi中&#xff08;将OpenWrt 23.05.3部署到VMware ESXi&#xff09;&#xff0c;那怎么将ESXi中的虚拟机迁移到workstation中呢&#xff1f; 首先&#xff0c;我们回顾一下&#xff0c;在将workstation中的虚拟机迁移到…

电脑如何不断网切换IP:实用方法与注意事项‌

在数字化时代&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;有时我们可能需要在保持网络连接的同时&#xff0c;切换电脑的IP地址&#xff0c;以满足特定的需求&#xff0c;如绕过地域限制、提升网络安全性或进行网络测试。本文将详细介绍如何在不…

【编译器】KEIL 静态链接库和动态链接库

【编译器】KEIL 静态链接库和动态链接库 文章目录 [TOC](文章目录) 前言一、工程1——生成静态链接库1. 代码准备2. 生成lib文件 二、工程2——调用静态链接库1.添加.h文件路径2. 调用生成的lib文件 三、参考资料总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…

【Linux】编辑器vim 与 编译器gcc/g++

目录 一、编辑器vim&#xff1a; 1、对vim初步理解&#xff1a; 2、vim的模式&#xff1a; 3、进入与退出&#xff1a; 4、vim命令模式下的指令集&#xff1a; 移动光标&#xff1a; 删除&#xff1a; cv&#xff1a; 撤销&#xff1a; 其他&#xff1a; 5、vim底行模…

成都栩熙酷网络科技有限公司抖音小店电商新篇章

在数字经济蓬勃发展的今天&#xff0c;电子商务行业迎来了前所未有的发展机遇。而在这股浪潮中&#xff0c;成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;凭借其敏锐的市场洞察力和强大的技术实力&#xff0c;与抖音小店这一新兴电商平台携手共进&…