在 React 项目中使用 Redux 实现公共下拉选状态共享并通知各组件更新的完整方案如下:


1. 安装 Redux 必要依赖

npm install @reduxjs/toolkit react-redux

2. 创建 Redux Store 和 Slice

store/selectSlice.js
import { createSlice } from '@reduxjs/toolkit';const initialState = {value: 'default', // 默认值options: [{ value: 'opt1', label: 'Option 1' },{ value: 'opt2', label: 'Option 2' }]
};export const selectSlice = createSlice({name: 'select',initialState,reducers: {setSelectValue: (state, action) => {state.value = action.payload;},updateOptions: (state, action) => {state.options = action.payload;}}
});export const { setSelectValue, updateOptions } = selectSlice.actions;
export default selectSlice.reducer;
store/store.js
import { configureStore } from '@reduxjs/toolkit';
import selectReducer from './selectSlice';export const store = configureStore({reducer: {select: selectReducer}
});

3. 在应用顶层提供 Store

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

4. 创建公共下拉选组件

components/GlobalSelect.js
import { Select } from 'antd';
import { useDispatch, useSelector } from 'react-redux';
import { setSelectValue } from '../store/selectSlice';const GlobalSelect = () => {const dispatch = useDispatch();const { value, options } = useSelector((state) => state.select);return (<Selectvalue={value}onChange={(val) => dispatch(setSelectValue(val))}options={options}style={{ width: 200 }}/>);
};export default GlobalSelect;

5. 在任意子组件中响应状态变化

components/DisplayComponent.js
import { useEffect } from 'react';
import { useSelector } from 'react-redux';const DisplayComponent = () => {const selectValue = useSelector((state) => state.select.value);useEffect(() => {console.log('下拉选值变化:', selectValue);// 这里可以执行数据获取等副作用操作}, [selectValue]);return <div>当前选择: {selectValue}</div>;
};export default DisplayComponent;

6. 在页面中使用(完整示例)

App.js
import GlobalSelect from './components/GlobalSelect';
import DisplayComponent from './components/DisplayComponent';
import AnotherComponent from './components/AnotherComponent';function App() {return (<div style={{ padding: 20 }}><h2>公共区域下拉选</h2><GlobalSelect /><div style={{ marginTop: 50 }}><h3>组件1</h3><DisplayComponent /></div><div style={{ marginTop: 50 }}><h3>组件2</h3><AnotherComponent /></div></div>);
}export default App;

7. 异步数据加载示例(如需要)

// 在需要的地方dispatch异步action
import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { updateOptions } from '../store/selectSlice';const DataLoader = () => {const dispatch = useDispatch();useEffect(() => {const fetchOptions = async () => {const res = await fetch('/api/options');const options = await res.json();dispatch(updateOptions(options));};fetchOptions();}, [dispatch]);return null;
};

关键实现原理说明:

  1. 状态集中管理:所有下拉选相关状态存储在 Redux store 中
  2. 单向数据流
    • 下拉选变更 → dispatch action → store 更新 → 所有订阅组件自动更新
  3. 组件通信
    • 任何组件都可以通过 useSelector 获取最新值
    • 任何组件都可以通过 useDispatch 修改值

性能优化建议:

  1. 精细化订阅:组件只订阅需要的具体值

    // 只订阅value变化(options变化不会触发重渲染)
    const value = useSelector((state) => state.select.value);
    
  2. 使用memo:对子组件进行记忆化

    import { memo } from 'react';
    const MemoizedComponent = memo(DisplayComponent);
    
  3. 批量更新:多个状态变更使用 redux-batched-actions


替代方案对比(Redux vs Context)

特性ReduxContext API
适用场景中大型应用小型应用
调试工具强大的Redux DevTools无内置工具
性能自动浅比较优化需要手动优化
学习曲线较高较低
异步处理内置Thunk/Saga支持需自行实现

对于需要全局共享且频繁更新的状态(如公共下拉选),Redux 仍然是更专业的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彻底清理ArcGIS 10.2残留的步骤

文章目录前言一、彻底清理ArcGIS 10.2残留的步骤总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、彻底清理ArcGIS 10.2残留的步骤 &#x1f527; 彻底清理ArcGIS 10.2残留的…

JDK主流版本及推荐版本

根据当前Java生态发展&#xff08;截至2025年7月&#xff09;&#xff0c;结合主流企业实践、技术特性和支持周期&#xff0c;以下是JDK主流版本及推荐版本的详细分析&#xff1a;&#x1f9e9; 一、主流JDK版本现状​​JDK 8 (LTS)​​​​使用比例​​&#xff1a;约30-35%&a…

如何从 Web2 转型到 Web3

如何从 Web2 转型到 Web3如何从 Web2 转型到 Web3引言Web2 与 Web3 的核心差异转型的实用步骤1. 打基础&#xff1a;学区块链和 Web3 概念2. 学核心技术栈&#xff1a;从 Solidity 到 dApp3. 重新设计产品&#xff1a;混合模式起步4. 应对坑&#xff1a;技术、监管和安全5. 建社…

RuoYi-Vue 项目 Docker 容器化部署 + DockerHub 上传全流程

本文详细记录本人在实际项目从 RuoYi-Vue 二次开发到 Docker 镜像打包、DockerHub 上传、异地一键部署的完整实战全过程。涵盖前后端打包产物准备、SQL初始化、docker-compose 管理、DockerHub 镜像上传、Gitee 代码管理、子模块大坑、数据库404等所有可能出错细节&#xff0c;…

【C语言进阶】题目练习

目录 1.箭形图案 思路&#xff1a; 代码&#xff1a; 2. 公务员面试 分析&#xff1a; 代码 &#xff1a; 3. 判断结构体大小&#xff08;1&#xff09; 答案&#xff1a; 分析&#xff1a; 4.判断结构体大小&#xff08;2&#xff09; 答案: 分析: 5.宏定义计算…

Blender入门笔记——建模篇(二)

前言 在数字建模的世界中&#xff0c;快捷键和高效的操作是提高工作效率的关键。本手册为您提供了常用的建模快捷键及操作技巧&#xff0c;帮助您在各种建模软件中更加得心应手。无论是进行点、线、面操作&#xff0c;还是调整视图、切换模式&#xff0c;这些快捷方式都将成为…

sqlite3学习---基础知识、增删改查和排序和限制、打开执行关闭函数

目录 一、数据库基础知识 1.分类 2.名词 3.嵌入式数据库 4.特点 5.sqlite3的安装 5.1在线安装 5.2编译 5.3验证是否安装成功 5.4sqlite3的使用 6.创建一个数据库 7.系统维护命令 二、数据库的创建和删除 1.创建一个表 1.1用法 1.2代码示例 2.删除一个表 2.1用…

Class24AlexNet

Class24AlexNet AlexNet AlexNet于2012年ImageNet 图像识别挑战赛&#xff08;ILSVRC-2012&#xff09;中以 top-5 错误率15.3%获得冠军&#xff0c;远远领先第二名。它首次在大型图像数据集上证明了深层卷积神经网络的强大能力。 AlexNet 的总体结构 AlexNet 总共有 8 层具有学…

枚举中间位置高级篇

参考资料来源灵神在力扣所发的题单&#xff0c;仅供分享学习笔记和记录&#xff0c;无商业用途。 核心思路&#xff1a;参考枚举中间位置基础篇-CSDN博客 力扣题单练习(灵神题单中摘取题目) 447. 回旋镖的数量 核心思路&#xff1a; 因给出的点都不相同&#xff0c;所以不会…

主数据管理系统能代替数据中台吗?

目录 一、主数据管理系统≠数据中台 1. 主数据管理系统&#xff1a;管的是 “不变的核心数据” 2. 数据中台&#xff1a;管的是 “流动中的价值” 二、为什么企业更该先建 MDM&#xff1f; 1. 数据中台解决不了数据本身问题 2. MDM 可以解决常见的基础问题 3. 数字化转型…

Nmap 终极教程:安装、常用命令及法律法规指南

Nmap 终极教程&#xff1a;安装、常用命令及法律法规指南 Nmap&#xff08;Network Mapper&#xff09;是一款强大的 网络扫描和安全审计工具&#xff0c;广泛用于渗透测试、网络探测和系统管理。本教程涵盖 安装方法、常用命令详解、输出解析 以及 法律法规注意事项&#xff…

开源嵌入式数组引擎TileDB的简单使用

TileDB 是C编写的存储和访问通用多维数组引擎&#xff0c;它的官方Github网站https://github.1git.de/TileDB-Inc/TileDB 1.下载源代码和二进制库 源代码https://github.1git.de/TileDB-Inc/TileDB/archive/refs/tags/2.28.1.tar.gz 选择符合你的机器CPU架构和操作系统的库 二进…

AI对服务器行业的冲击与启示:从挑战走向重构

更多云服务器知识&#xff0c;尽在hostol.comAI&#xff08;人工智能&#xff09;技术的迅猛发展&#xff0c;已深刻影响了多个行业&#xff0c;服务器行业亦不例外。在过去&#xff0c;服务器的主要任务是简单地提供存储、计算和传输数据的服务。然而&#xff0c;随着AI的崛起…

基于三台主机搭建 Web 服务环境:Nginx、NFS 与 DNS 配置全流程

基于三台主机搭建 Web 服务环境&#xff1a;Nginx、NFS 与 DNS 配置全流程 一、引言 在当今数字化的时代&#xff0c;搭建一个稳定、高效的 Web 服务环境是许多开发者和运维人员的常见需求。本文将详细介绍如何利用三台主机搭建一个包含 Nginx、NFS 和 DNS 服务的 Web 环境&…

MySQL——MVCC

1.为什么需要MVCC在并发场景下&#xff0c;读写操作会面临严重的冲突问题&#xff1a;1.读操作如果遇到写操作&#xff0c;要么“读到未提交的脏数据”&#xff0c;要么“被写操作阻塞&#xff08;等待锁释放&#xff09;”&#xff1b;2.写操作如果遇到读操作&#xff0c;要么…

数据结构第2问:什么是算法?

算法 算法是一组用于解决具体问题的、明确的、有序的步骤或规则&#xff0c;能够在有限的时间内通过这些步骤得到问题的答案。 算法的5个重要特性&#xff1a; 有穷性&#xff1a;算法必须在有限的步骤内结束&#xff0c;不能无限循环&#xff0c;保证最终能够得到结果。确定性…

12-大语言模型—Transformer 打地基,下游任务盖出百样房,指标来验收|下游任务白话指南

目录 1、核心逻辑&#xff1a;Transformer 的 “语言处理闭环” 2、转导与感知 → 模型咋 “理解语言”&#xff1f; 2.1、 人类 vs 机器的 “语言理解逻辑” 2.2、 自注意力机制&#xff1a;模型 “理解语言” 的数学核心 2.2.1、通俗拆解 2.2.1.1、是什么&#xff1f; …

深入探索爬虫与自动化脚本:释放效率的利器

在当今信息爆炸的时代&#xff0c;高效获取和处理数据已成为核心竞争力。爬虫与自动化脚本正是解决这一痛点的关键技术——它们如同数字世界的勤劳助手&#xff0c;帮我们自动完成繁琐重复的任务。下面我们来系统了解这两项技术的核心要点、应用场景和最佳实践。一、爬虫与自动…

React函数组件的“生活管家“——useEffect Hook详解

&#x1f3af; React函数组件的"生活管家"——useEffect Hook详解 1. &#x1f31f; 开篇&#xff1a;从生活中的"副作用"说起 嘿&#xff0c;各位掘友们&#xff01;今天咱们来聊聊React函数组件里的一个“大管家”——useEffect Hook。你可能会问&#x…

python基础:request请求Cookie保持登录状态、重定向与历史请求、SSL证书校验、超时和重试失败、自动生成request请求代码和案例实践

Cookie保持登录状态cookie session鉴权机制 cookie是由web服务器保存在用户浏览器&#xff08;客户端&#xff09;上的小文本文件&#xff0c;他可以包含有关用户的信息。无论何时用户访问到服务器&#xff0c;都会带上该服务器的cookie信息&#xff0c;一般cookie都是有有效期…