首页 > 其他分享 >点击菜单生成tabs(vue3.0)

点击菜单生成tabs(vue3.0)

时间:2024-04-17 15:46:48浏览次数:16  
标签:菜单 const tabs state vue3.0 tab path tabsList

1.安装vuex

 npm install vuex@next --save

在main.js中引用vuex

2.在main.js同级目录新建store/store.js文件

 代码:

import { createStore } from 'vuex'
export default createStore({
	state: {
		tabsList: []
	},
	mutations: {
		addTab(state, tab) {
			// 判断是否已经存在,如果不存在,才放入
			if(state.tabsList.some(item => item.path === tab.path)) return;
			state.tabsList.push(tab)
		}
	},
	getters: {
		// 获取Tabs
		getTabs(state) {
			return state.tabsList
		}
	}
})

  

  

3.在admin.vue页实现功能

 html代码:

<el-tabs v-model="activeTab" @tab-click="clickBtn" type="card" class="demo-tabs" closable @tab-remove="removeTab">
		<el-tab-pane v-for="item in tabsList" :key="item.path" :label="item.title" :name="item.path">
		</el-tab-pane>
</el-tabs>

  

js代码:

<script setup>
    import { useStore } from 'vuex'
    import { useRoute, useRouter } from 'vue-router';
    import { reactive, onMounted, computed, watch, ref } from 'vue';
    let isCollapse = ref(false)
    /*选项卡*/
    const store = useStore()
    const route = useRoute()
    const router = useRouter()
    const tabsList = computed(() => {
        return store.getters['getTabs']
    })
    //console.log(tabsList, "tabsList")
    const activeTab = ref('2')

    //点击选项卡,跳转到相应的页面,菜单也恢复到相应的页面
    const clickBtn = (tab) => {
        const {
            props
        } = tab
        router.push({
            path: props.name
        })
    }

    //删除选项卡,跳转到临近页面,这个tabs标签删除
    const removeTab = (targetName) => {
        if(store.state.tabsList.length === 1) return
        const tabs = tabsList.value
        let activeName = activeTab.value
        if(activeName === targetName) { //如果当前的路由是要删除的页面
            tabs.forEach((tab, index) => {
                if(tab.path === targetName) {
                    const nextTab = tabs[index + 1] || tabs[index - 1] //如果在中间的tab,删除会选择在后面的一个;如果在最后,会选择在前面的一个tab
                    if(nextTab) {
                        activeName = nextTab.path //更换当前路由的地址
                    }
                }
            })
        }
        //重新设置当前激活的选项卡
        activeTab.value = activeName
        //重新设置选项卡数据,将数组中去掉删除的元素
        store.state.tabsList = tabs.filter((tab) => tab.path !== targetName)
        //跳转路由
        router.push({
            path: activeName
        })
    }

    //添加路由的选项卡
    const addTabs = () => {
        const {
            path,
            meta,
            name
        } = route
        const tabs = {
            title: name,
            path: path
        }
        store.commit('addTab', tabs)
        //store.state.tabsList=[]
    }
    //激活选项卡
    const setActiveTab = () => {
        activeTab.value = route.path //因为el-tab-pane的name是item.path,所以activeTab也是path
    }

    watch(() => route.path, () => {
        //激活选项卡
        setActiveTab()
        //监听路由的变化
        addTabs()
    })

    //解决刷新数据页面丢失的问题
    const beforeRefresh = () => {
        window.addEventListener("beforeunload", () => { //监听刷新
            // sessionStorage当浏览器关闭时,结束。localStorage,没有期限
            sessionStorage.setItem('tabsView', JSON.stringify(tabsList.value))
        })
        //页面加载时取数据
        let tabSession = sessionStorage.getItem('tabsView')
        if(tabSession) {
            let oldTabs = JSON.parse(tabSession)
            if(oldTabs.length > 0) {
                store.state.tabsList = oldTabs
            }
        }
    }
    //调用函数需要在模板加载之后调用
    onMounted(() => {
        beforeRefresh()
        setActiveTab()
        addTabs()
    })
    const toggleCollapse = function() {
        isCollapse.value = !isCollapse.value
    }
</script>

 

 

 

 

 ps参考文档:

https://blog.csdn.net/qq_45489665/article/details/125256001

https://blog.csdn.net/ksx2333/article/details/122292507

标签:菜单,const,tabs,state,vue3.0,tab,path,tabsList
From: https://www.cnblogs.com/nengnengc-nnc/p/18140828

相关文章

  • 在CSS中创建一个鼠标悬停时弹出菜单
    要在CSS中创建一个鼠标悬停时弹出菜单,你可以使用HTML和CSS来实现。以下是一个简单的例子:HTML:<divclass="dropdown"><buttonclass="dropbtn">点击我</button><divclass="dropdown-content"><ahref="#">链接1</a>......
  • 鸿蒙HarmonyOS实战-ArkUI组件(Tabs)
    ......
  • HarmonyOS-基础之Tabs组件
    1、Tabs的基本使用@Entry@ComponentstructIndex{privatecontroller:TabsController=newTabsController();//声明周期函数aboutToAppear(){//页面加载1s后跳转到商城setTimeout(()=>{this.controller.changeIndex(1)},1000)}......
  • ABP后台管理页面AdminLTE框架,实现菜单项点击后,菜单展开当前菜单项高亮
    <style>.CurrentMenuColor{background-color:#007bff;color:#fff;}</style><script>//左侧菜单定位$(document).ready(function(){varpathname=window.location.pathname+window.location.search;......
  • 右击canvas画布时,显示自定义菜单
    <style> .clickRightMenu{ width:110px; background-color:#fff; font-size:12px; position:absolute; text-align:left; padding:2px0; border:1pxsolid#ccc; display:none; z-index:100; } .clickRightMe......
  • Vue — Vue面试题:Vue3.0 特性
    CompositionAPI(组合式API):CompositionAPI允许开发者将逻辑按照功能或者相关性进行组织,而不是按照选项的不同部分(如data、methods、computed等)来分散代码。这种方式更灵活、更易于复用和维护,特别适用于编写大型复杂的组件。基于Proxy的响应式系统:Vue3中的响应式系统基于ES6......
  • 8. 托盘图标与菜单
    内容概要:托盘图标的设置与事件右键菜单的相关操作窗口组件:1.组件的属性组件属性:位置组件属性:可视2.组件的事件窗口_托盘事件-带有参数的事件的使用方法3.组件的方法置托盘图标菜单的操作1.创建菜单子菜单的添加菜单的属性:可视菜单的属性:禁止2.菜单的事件菜单......
  • 批处理脚本制作两个菜单的例子,一个用于DISM备份wim系统,另一个用于还原备份WIM
    批处理脚本制作两个菜单的例子,一个用于备份系统,另一个用于还原备份:batCopyCode@echooff:menuclsecho请选择一个选项:echo1.备份系统echo2.还原备份echo3.退出set/pchoice=请输入选项:if"%choice%"=="1"(call:backup)elseif"%choice%"=="2"(......
  • 2024年4月8日-UE5-开始菜单、事件分发器、UI预构造
    做个简单的菜单在主页面这里新建一个地图,按CTRL+N 把地面复制过来在开始关卡新建一个摄像机 打开关卡蓝图,先左键选中摄像机,然后在关卡蓝图里点右键,把摄像机拖下来   在UI里新建一个用户控件 再新建一个通用按钮 打开按钮的控件蓝图拖一个按钮进来 然......
  • Vite+Vue3.0项目使用ant-design-vue <a-calendar>日期组件汉化
    antd的弹框、日期等默认为英文,要把英文转为中文请看下文:1.首先我们要在main.js中引入ant-design组件库并全局挂载:importAppfrom'./App'importAntdfrom'ant-design-vue';import'ant-design-vue/dist/antd.css';constapp=createApp(App);app.use(Antd);2.然......