新闻中心
使用 React 和 MUI X DataGrid 管理多个表格的选中数据

本文档旨在解决在使用 React、Redux Toolkit 和 MUI X DataGrid 时,如何有效地管理来自多个 DataGrid 组件的选中行数据。我们将探讨一种将每个 DataGrid 的选中数据存储在单独的状态中的方法,并提供详细的代码示例和步骤说明。
在使用 React 和 MUI X DataGrid 构建复杂应用时,经常会遇到需要在多个 DataGrid 组件中管理选中行数据的情况。 传统的集中式状态管理方法可能会导致代码复杂性增加,并且难以维护。本文档将介绍一种更有效的方法,即为每个 DataGrid 组件使用单独的状态,从而简化代码并提高可维护性。
问题背景
假设我们有一个包含多个 DataGrid 组件的页面,每个组件显示不同类型的数据(例如,TCG 技能、管理技能、销售技能和软技能)。每个 DataGrid 组件都有复选框,允许用户选择多行。我们需要将每个 DataGrid 组件中选中的行数据存储在单独的状态中,以便在应用程序的其他部分中使用。
解决方案
该解决方案的核心思想是为每个 DataGrid 组件创建一个单独的 Redux slice,并在每个 slice 中维护一个 selected 状态来存储选中的行数据。
1. 创建 Redux Slice
首先,为每个 DataGrid 组件创建一个 Redux slice。例如,对于 "softSkill",创建一个 softSkillSlice.js 文件:
// softSkillSlice.js
import { createSlice } from '@reduxjs/toolkit';
const softSkillSlice = createSlice({
name: 'softSkill',
initialState: {
skills: [], // 假设你的 skill 数据存储在这里
selected: [],
},
reducers: {
setSkills: (state, action) => {
state.skills = action.payload;
},
setSkillSelected: (state, action) => {
state.selected = action.payload;
},
},
});
export const { setSkills, setSkillSelected } = softSkillSlice.actions;
export default softSkillSlice.reducer;对其他 DataGrid 组件(adminSkill, tcgSkill, salesSkill)重复此步骤,并相应地调整 slice 名称和 reducer。
NetGou网店购物系统
NetGou是一款国内知名的购物系统网店系统,它功能强大完善、运行稳定快
速、界面友好人性化、可扩展性强。系统支持无限级商品分类管理、商品品牌管理、商品供货商管理、商品可同时加入多个商品分类商品批发价格,购买不同的商品数量可以设置不同的价格。不同的商品选项可以设置不同的价格订单中可以加入商品、删除商品、更改商品数量和价格、更改配送方式和配送费用新闻管理、销售统计、数据备份恢复,不同的会员等级可以设置
0
查看详情
2. 修改 DataGrid 组件
修改 TableReusable 组件,使其接受一个 setSkillSelected prop,该 prop 是对应 Redux slice 的 setSkillSelected action。
// TableReusable.js
import React from 'react';
import { DataGrid } from '@mui/x-data-grid';
import { useDispatch } from 'react-redux';
import { useSearchBar } from '../hooks/useSearchBar';
export const TableReusable = ({ data, columns, bool, setSkillSelected }) => {
const dispatch = useDispatch();
const onRowsSelectionHandler = (ids) => {
const selectedRowsData = ids?.map((id) =>
data?.find((row) => row?._id === id || row?.id === id)
);
dispatch(setSkillSelected(selectedRowsData));
};
const filteredRows = useSearchBar({ row: data });
return (
<DataGrid
sx={{ width: 'fit-content' }}
rows={filteredRows}
getRowId={(row) => row?.id || row?._id || row?.CommonId}
columns={columns}
initialState={{
pagination: { paginationModel: { pageSize: 10 } },
}}
onRowSelectionModelChange={(ids) => onRowsSelectionHandler(ids)}
componentsProps={{
pagination: {
labelRowsPerPage: `Nb par page`,
},
}}
pageSizeOptions={[5, 10, 15, 20, 50, 100]}
checkboxSelection={bool}
/>
);
};3. 修改 DataGrid 包装组件
修改包装 DataGrid 组件(例如 SoftTable、AdminTable 等),并将相应的 setSkillSelected action 作为 prop 传递给 TableReusable 组件。
// SoftTable.js
import React from 'react';
import { useSelector } from 'react-redux';
import { TableReusable } from '../../../reusable/TableReusable';
import { setSkillSelected } from '../../../slices/softSkillSlice';
export const SoftTable = () => {
const data = useSelector((state) => state?.softSkill?.skills) || [];
const columns =
data.length > 0
? Object.keys(data[0])
.filter(
(field) =>
field !== 'Level' &&
field !== 'updated_at' &&
field !== 'created_at'
)
.map((field) => ({
field: field,
headerName: field,
width: 130,
}))
: [];
return (
<TableReusable
data={data}
columns={columns}
bool={true}
setSkillSelected={setSkillSelected}
/>
);
};对其他 DataGrid 包装组件重复此步骤,并传递相应的 setSkillSelected action。
4. 在父组件中使用 DataGrid 包装组件
在父组件(例如 ListSkills)中使用 DataGrid 包装组件。
// ListSkills.js
import React from 'react';
import { Box, Typography } from '@mui/material';
import { TcgTable } from '../list/TcgTable';
import { AdminTable } from '../list/AdminTable';
import { SalesTable } from '../list/SalesTable';
import { SoftTable } from '../list/SoftTable';
export const ListSkills = () => {
return (
<>
<Box sx={{ margin: '2em 0' }}>
<Typography
sx={{
color: '#006E8C !important',
fontWeight: 'bold',
margin: '0.5em 0',
}}
variant="h6"
>
TCG Skills
</Typography>
<TcgTable />
</Box>
<Box sx={{ margin: '2em 0' }}>
<Typography
sx={{
color: '#006E8C !important',
fontWeight: 'bold',
margin: '0.5em 0',
}}
variant="h6"
>
ADMIN Skills
</Typography>
<AdminTable />
</Box>
<Box sx={{ margin: '2em 0' }}>
<Typography
sx={{
color: '#006E8C !important',
fontWeight: 'bold',
margin: '0.5em 0',
}}
variant="h6"
>
SALES skills
</Typography>
<SalesTable />
</Box>
<Box sx={{ margin: '2em 0' }}>
<Typography
sx={{
color: '#006E8C !important',
fontWeight: 'bold',
margin: '0.5em 0',
}}
variant="h6"
>
SOFT skills
</Typography>
<SoftTable />
</Box>
</>
);
};总结
通过为每个 DataGrid 组件创建单独的 Redux slice,我们可以有效地管理来自多个表格的选中数据。这种方法简化了代码,提高了可维护性,并使我们能够轻松地访问和使用应用程序其他部分的选中数据。
注意事项
- 确保正确配置 Redux store,并将所有 slice 添加到 reducer 中。
- 根据你的具体需求调整代码示例。
- 考虑使用 TypeScript 来提高代码的类型安全性和可读性。
以上就是使用 React 和 MUI X DataGrid 管理多个表格的选中数据的详细内容,更多请关注其它相关文章!
# js
# 承德响应式网站建设服务
# seo专员网络推广
# 嘉兴网站优化流程
# 虹口seo优化
# 福田seo推广哪家好做
# 莆田推广网站选哪家好些
# 重庆抖音seo精准
# 建设工程律师推广网站
# 湘潭网站优化推荐哪家好
# 服务端
# 商品分类
# 有效地
# 自定义
# 并将
# 创建一个
# 行数
# 购物系统
# 网店
# 多个
# red
# typescript
# react
# 同类平台搜索优化网站
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
c++ 命名空间怎么用 c++ namespace使用指南
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
在Go Martini框架中高效服务动态生成图像的实践指南
谷歌google账号注册详细步骤 谷歌账号注册官方教程
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
Win10双系统截图高效法 截屏快捷键速记【技巧】
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
深入理解J*aScript中的B样条曲线与节点向量生成
AO3官网镜像链接 Archive of Our Own同人文在线浏览
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
J*a递归快速排序中静态变量导致数据累积问题的解决方案
vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
使用Pandas转换并合并DataFrame:多列映射至统一结构
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
mysql如何设置表访问权限_mysql表访问权限配置
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
Golang并发任务中错误如何聚合_Golang goroutine error收集方式
React Router v6 教程:构建认证保护的私有路由与重定向策略
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
J*a应用集成GitHub CLI与API认证指南
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
Pandas DataFrame 多条件优先级排序与排名
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
J*aScript DOM操作:高效清空列表元素的策略与实践
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
Discord Slash 命令响应超时问题的异步解决方案
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
Python字典中优雅地迭代剩余元素的方法
Excel Power Pivot如何处理XML数据源 构建高级数据模型
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
composer的"require-dev"部分是用来做什么的?
PHP中高效并行检查多链接状态的教程
小米汽车11月交付量突破40000台!雷军:将继续努力
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
自定义Bag-of-Words实现:处理带负号的词汇权重
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
J*aScriptWebpack优化_J*aScript构建工具实战
zookeeper 都有哪些功能?
Python自定义类排序:解决lambda键值访问TypeError的实践指南
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
京东单号查询入口_京东快递订单追踪入口


2025-10-12
浏览次数:次
返回列表