IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3使用keep-alive缓存已打开过的菜单,使用el-tabs展示面包屑路由。 -> 正文阅读

[JavaScript知识库]vue3使用keep-alive缓存已打开过的菜单,使用el-tabs展示面包屑路由。

vuex

import { debug } from "console";
import { createStore } from "vuex";
let availButtons = new Set();
export default createStore({
    state: {
        count: 0,
        tabsList: [
            {
                path: "/",
                name: "Profile",
                meta: {
                    title: "首页",
                },
            },
        ],
        keepAliveList: ["Profile"],
        currentMenu: null,
        menu: [],
        //  按钮权限
        buttons: availButtons,
    },
    mutations: {
        // 判断按钮是否有权限
        setButtons(state, payload) {
            state.buttons = payload.buttons;
        },
      
        // 选择标签 选择面包屑
        selectMenu(state, val) {
            console.log({ val });
            if (val.path === "/") {
                // state.currentMenu = null;
            } else {
                // state.currentMenu = val.name;
                let result = state.tabsList.findIndex(
                    (item) => item.name === { ...val }.name
                );
                if (result === -1) {
                    state.tabsList.push({ ...val });
                }
                // debugger;
            }
        },
        closeTab(state, val) {
            let result = state.tabsList.findIndex(
                (item) => item.name === val.name
            );
            state.tabsList.splice(result, 1);
            state.keepAliveList.length = 0;
            state.tabsList.forEach((item) => {
                state.keepAliveList.push(item.name);
            });
        },
        updateKeepList(state, val) {
            let index = state.keepAliveList.findIndex(
                (item: any) => item.name === val.name
            );
            if (index === -1) {
                state.keepAliveList.push(val.name);
            }
        },
    },
    actions: {
        
    },
    getters: {
      
        
    },
});

component/CommonTab.vue

<template>
  <div class="tabs">
    <el-tabs
      v-model="currentName"
      type="card"
      editable
      @tab-remove="handleTabsEdit"
      @tab-click="handleTabClick"
    >
      <el-tab-pane
        editable
        :key="tag.meta.title"
        v-for="tag in tags"
        :label="tag.meta.title"
        :name="tag.meta.title"
      >
      </el-tab-pane>
    </el-tabs>
    <div>{{ tags }}</div>
  </div>
</template>
<script setup lang="ts">
import * as Utils from "@/utils";
import { mapState, mapMutations, useStore } from "vuex";
import { ref, reactive, onMounted, watch } from "vue";
import { useRouter, useRoute } from "vue-router";
const currentName = ref("首页");
const tags = ref([]);
const store = useStore();
const router = useRouter();
const route = useRoute();
onMounted(() => {
  tags.value = store.state.tabsList;
  watch(
    () => route.path,
    () => {
      currentName.value = route.meta.title as string;
    },
    { immediate: true, deep: true }
  );
});
function handleClose(tag: any, index: any) {
  let length = tags.value.length - 1;
  store.commit("closeTab", tag);
  if (tag.name !== route.name) {
    return;
  }
  if (index === length) {
    router.push({ path: tags.value[index - 1].path });
  } else {
    router.push({ path: tags.value[index].path });
  }
}
function changeMenu(item: any) {
  let params = {
    path: route.path,
    name: route.name,
    meta: {
      title: route.meta.title,
    },
  };
  store.commit("selectMenu", params);
}
function handleTabsEdit(targetName: any, action: any) {
  let result = tags.value.findIndex(
    (item: any) => item.meta.title === targetName
  );
  handleClose(tags.value[result], result);
}
function handleTabClick(tab: any) {
  let result = tags.value.findIndex(
    (item: any) => item.meta.title === currentName.value
  );
  changeMenu(tags.value[result]);
  router.push({ path: tags.value[result].path });
}
</script>
<style lang="scss">
.tabs {
  line-height: 50px;
  margin-left: 18px;
  text-align: left;
  .el-tag {
    margin-right: 5px;
    cursor: pointer;
  }
  .dark {
    background: #409eff;
    border-color: #409eff !important;
    color: #fff !important;
    .el-tag__close {
      color: #fff !important;
    }
  }
  .plain {
    background: #fff;
  }
  .el-tag {
    color: #333;
    .el-tag__close {
      color: #333;
      &:hover {
        background: #cbcbce;
        font-weight: bolder;
      }
    }
    border-color: rgb(207, 204, 204);
  }
}
</style>

vue3使用keepalive写法有变化。

<router-view v-slot="{ Component }">
  <keep-alive :include="store.state.keepAliveList">
    <component :is="Component" :key="route.path" />
  </keep-alive>
</router-view>
菜单点击事件也有变化,获取的路由的上一次的路由,所以需要从菜单渲染中拿到数据。
与keepaliveList.keyValue一一对应。
const menuItemClick = (item: any) => {
  const current = router;
  let params = {
    path: item.path,
    name: item.routeName,
    meta: {
      title: item.name,
    },
  };
  store.commit("selectMenu", params);
  store.commit("updateKeepList", params); 
};
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:51:45  更:2022-05-14 09:52:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:51:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码