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

react+anddesign组件Tabs实现后台管理系统自定义页签头

在这里插入图片描述
使用react和anddesign开发一个后台管理页签头。这里使用全局状态管理zustand来实现这个功能。

安装zustand

npm install zustand --save

创建store文件夹并在文件夹下创建useTabs.ts文件

// useTabs.ts
import { create } from 'zustand'interface tabLiSTState {tabList: Array<any>, // 页签头数据setTabList: (tabs: Array<any>) => void // 添加tabs全局方法
}export const useTabs = create<tabLiSTState>((set) => ({tabList: [{ title: "首页", path: '/' }],setTabList: (tabs) => set({ tabList: tabs }),
}))

创建Tabs组件组件

使用useEffect监听路由的变化,路由变化调用添加页签方法把当前菜单名称title和路径添加到全局状态管理中

import { useState, useEffect } from 'react'
import { Tabs } from 'antd'
import { useLocation, useNavigate } from 'react-router-dom'
import { routerArray } from '@/router/routes'
import MoreButton from './components/MoreButton'
import { useTabs } from '@/store/useTabs'
import './index.scss'
import { searchRoute } from '@/utils'
const LayoutTabs = () => {const { pathname } = useLocation()const navigate = useNavigate();const [activeTabs, setActiveTabs] = useState(pathname)const { tabList, setTabList } = useTabs()// 监听路由变化useEffect(() => {addTabs()// eslint-disable-next-line react-hooks/exhaustive-deps}, [pathname])const clickTabs = (path: string) => {navigate(path)}// 添加tabsconst addTabs = () => {const route = searchRoute(pathname, routerArray)const newTabList = JSON.parse(JSON.stringify(tabList))if(tabList.every(item => item.path !== pathname)) {newTabList.push({title: route.meta!.title,path: route.path,})}setTabList(newTabList)setActiveTabs(pathname)}// 关闭tabsconst closeTabs = (path) => {if(path === '/') returnif(pathname === path) {tabList.forEach((item, index) => {if(item.path !== path) returnconst nextTab = tabList[index + 1] || tabList[index - 1]if(!nextTab) returnnavigate(nextTab.path)}) }setTabList(tabList.filter(item => item.path !== path))}const item = tabList.map((i) =>{return {label: i.title,key: i.path,closable: i.path !== '/'}})return (<div className='tabs'><TabsanimatedhideAddtype="editable-card"activeKey={activeTabs}onChange={clickTabs}onEdit={closeTabs}items={item}/><MoreButton tabList={tabList} closeTabs={closeTabs} setTabList={setTabList} /></div>)
}

更多操作

主要是一些重新加载、关闭当前标签页、关闭左侧、关闭右侧、关闭其它、关闭所有
MoreButton组件

import { DownOutlined } from '@ant-design/icons';
import { useLocation, useNavigate } from 'react-router-dom'
import { Dropdown } from 'antd';const MoreButton = (props) => {const { pathname } = useLocation()const navigate = useNavigate();// 关闭左侧const closeLeftTabs = () => {const activeIndex = props.tabList.findIndex(item => item.path === pathname)const newTabs = props.tabList.filter((_, index) => index >= activeIndex || _.path === '/')props.setTabList(newTabs)}// 关闭右侧const closeRightTabs = () => {const activeIndex = props.tabList.findIndex(item => item.path === pathname)const newTabs = props.tabList.filter((_, index) => index <= activeIndex)props.setTabList(newTabs)}// 关闭其它const closeOtherTabs = () => {const list = props.tabList.filter(item => item.path === pathname || item.path === '/')props.setTabList(list)}// 关闭所有const closeAllTabs = () => {const list = props.tabList.filter(item => item.path === '/')props.setTabList(list)navigate('/')}const items = [{key: '1',label: '重新加载',onClick: () => {window.location.reload();}},{key: '2',label: '关闭当前',onClick: () => {return props.closeTabs(pathname)}},{key: '3',label: '关闭左侧',onClick: closeLeftTabs},{key: '4',label: '关闭右侧',onClick: closeRightTabs},{key: '5',label: '关闭其它',onClick: closeOtherTabs},{key: '6',label: '关闭所有',onClick: closeAllTabs},];return (<Dropdown.ButtonclassName='moreButton'icon={<DownOutlined />}menu={{ items }}type="primary">更多</Dropdown.Button>);
}export default MoreButton;
http://www.dtcms.com/a/391483.html

相关文章:

  • Midscene 低代码实现Android自动化
  • ADB使用指南
  • FunCaptcha如何查找sitekey参数
  • 大模型如何让机器人实现“从冰箱里拿一瓶可乐”?
  • Python实现液体蒸发优化算法 (Evaporation Rate Water Cycle Algorithm, ER-WCA)(附完整代码)
  • MySQL 数据库的「超级钥匙」—`mysql_real_connect`
  • LeetCode 每日一题 3484. 设计电子表格
  • RAGAS深度解析:引领RAG评估新时代的开源技术革命
  • aave v3.4 利率计算详解
  • rook-ceph CRD资源配置时效问题
  • MySQL学习笔记-进阶篇
  • Rust 关键字
  • 排版使用latex排版还是word排版更容易通过mdpi remote sensing的审稿?
  • Qt QML ToolTip弹出方向控制问题探讨
  • [Windows] PDFQFZ(PDF加盖骑缝章) v1.31
  • 四网络层IP-子网掩码-路由表-真题
  • 安装QT6.9.2
  • 使用 NodePort
  • IP6163至为芯具备MPPT硬件算法的太阳能光伏降压DC-DC芯片
  • 从“道生一”理念看宇宙规律与现代科技之关联
  • CKS-CN 考试知识点分享(9) 关闭API凭据自动挂载
  • 初次接触MCP
  • 高防服务器按照应用场景划分为哪些类型
  • 【项目】基于One Thread One Loop模型的高性能网络库实现 - 服务器模块实现
  • 京准电钟NTP时间同步服务器通信系统技术应用方案
  • Next.js 错误处理:自定义错误页面和错误边界
  • 操作教程|使用Cursor工具连接JumpServer资产
  • prefix Lm和causal LM encoder-decoder区别以及各自有什么缺点
  • 从零开始学习PX4源码29(Commander 任务)
  • 基于高速摄像机与6Dof测量的手机跌落实验分析