欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用vue3.2實現(xiàn)多頁簽導(dǎo)航

 更新時間:2023年12月06日 11:13:12   作者:前端er小芳  
這篇文章主要為大家詳細介紹了如何使用vue3.2 + elementPlus + pinia 實現(xiàn)多頁簽導(dǎo)航,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下

一、實現(xiàn)思路

  • 單擊菜單時數(shù)據(jù)添加store對象,添加數(shù)據(jù)時要去重以及數(shù)量限制,不可無限添加
  • 多頁簽導(dǎo)航數(shù)據(jù)從store對象里取
  • 初始化會顯示【首頁】標簽導(dǎo)航,同時固定不可刪除
  • 單擊多頁簽導(dǎo)航,跳轉(zhuǎn)到對應(yīng)路由
  • 激活樣式處理
  • 持久化處理
  • 刪除多頁簽導(dǎo)航事件

二、具體實現(xiàn)步驟

1. 定義store

// src/store/tag-list.js
import { defineStore } from "pinia";

export const useTagStore = defineStore('tag',{
    state: ()=> ({
        tagList: [
            // 初始化默認展示【首頁】標簽導(dǎo)航
            {
                path:'/index',
                name: 'index',
                meta: { title: '首頁'}
            }
        ]
    }),
    getters: {
        tagListGetter: state=> state.tagList
    },
    actions: {
        addTag(item) {
            this.tagList.push(item)
        },
        delTag(item) {
            // 找出要刪除的tag的索引值
            const i = this.tagList.findIndex(v => v.path === item.path)
            this.tagList.splice(i,1)
        }
    },
    // 持久化
    persist: {
        enabled: true, // 開啟
        strategies: [
            {
                key: 'tagList',
                storage: sessionStorage
            }
        ]

    }

2. 單擊菜單時數(shù)據(jù)添加store對象

在導(dǎo)航組件中(naveItem.vue)添加點擊事件addTag

    <!-- 無子級 -->
    <el-menu-item :index="item.path" v-if="!item.children" @click="addTag(item)">
        <el-icon><Menu /></el-icon>
        <span>{{item.meta.title}}</span>
    </el-menu-item>
    <!-- 有子級 -->
    <el-sub-menu :index="item.path" v-else>
        <template #title>{{item.meta.title}}</template>
        <nav-item v-for="sub in item.children" :key="sub.path" :item="sub"></nav-item>
    </el-sub-menu>

addTag方法邏輯如下,已有注釋,不再詳細說明。

import { storeToRefs } from 'pinia'
import { useTagStore } from '@/store/tag-list.js'
const tagStore = useTagStore()
const { tagList } = storeToRefs(tagStore)

const { item } = defineProps({
    item: {
        type: Object
    }
})

// 點擊路由,添加標簽導(dǎo)航,注意去重
const addTag = (item) => {
    // 添加前判斷是否已存在
    const isRepeat = tagList.value.some(v => v.path === item.path) // 找到則返回true,否則返回false
    if(isRepeat) return
    // 限制最多只能打開10個標簽導(dǎo)航頁
    if(tagList.value.length === 10) {
        // 自動把第二個刪除
        tagStore.delTag(tagList.value[1])
    }
    // 添加
    tagStore.addTag(item)
}

3. 定義一個tag組件

定義一個tag組件,從store中取出tagList并渲染;

1.首頁標簽導(dǎo)航不可關(guān)閉,通過當前tag的path不等于首頁的path來控制el-tag的closeable是否展示;

2.定義默認展示的導(dǎo)航標簽defaultUrl,默認為首頁的path(/index);通過監(jiān)聽路由變化,將defaultUrl 等于變化后的路由地址;并且在template中判斷:tag的path是否等于defaultUrl,是則不設(shè)置type(el-tag不設(shè)置type默認為藍色),其他則為type=info;

3.點擊導(dǎo)航標簽,能夠跳轉(zhuǎn)到對應(yīng)路由,給標簽添加handleJump事件。

4.刪除導(dǎo)航標簽事件

a.刪除的不是當前激活模塊,正常刪除

b.刪除的是當前激活模塊

  • 當前激活模塊是最后一個導(dǎo)航標簽,則需要高亮前一個導(dǎo)航標簽
  • 當前激活模塊不是最后一個導(dǎo)航標簽,則需要高亮后一個導(dǎo)航標簽

代碼代碼如下:

    <div class="tags">
        <el-scrollbar class="scroll-container">
            <el-tag
                v-for="(tag,index) in tagList"
                :key="tag.path"
                class="mx-1"
                :closable="tag.path !== '/index'"
                :type="tag.path === defaultUrl? '' : 'info'"
                @click="handleJump(tag)"
                @close="handleClose(tag,index)"
            >
                {{ tag?.meta?.title }}
            </el-tag>
        </el-scrollbar>
    </div>
import { ref,watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { storeToRefs } from 'pinia'
import { useTagStore } from '@/store/tag-list.js'

const route = useRoute()
const router = useRouter()
const tagStore =  useTagStore()
const { tagList } = storeToRefs(tagStore)

// 高亮當前路由導(dǎo)航的標簽頁
const defaultUrl = ref('/idnex')
watch(route,(newVal,oldVal) => {
    defaultUrl.value = newVal.path

},{deep: true,immediate: true})

// 跳轉(zhuǎn)路由
const handleJump = (tag) => {
    // 重復(fù)點擊標簽,不跳轉(zhuǎn)
    if(route.path === tag.path) return
    router.push(tag.path)
}

// 關(guān)閉標簽
const handleClose = (tag, i) => {
    // store 刪除
    tagStore.delTag(tag)
    // 1.刪除非當前模塊,正常刪除
    if(route.path !== tag.path) return
    // 2.刪除當前模塊
    if(i === tagList.value.length) {
        // 2.1當前模塊屬于最后一個模塊,刪除后需要高亮前一個模塊
        handleJump(tagList.value[i-1])
    }else {
        // 2.2當前模塊屬于中間模塊模塊,刪除后需要高亮后一個模塊
        handleJump(tagList.value[i])
    }
}

具體效果

到此這篇關(guān)于使用vue3.2實現(xiàn)多頁簽導(dǎo)航的文章就介紹到這了,更多相關(guān)vue多頁簽導(dǎo)航內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Unocss(原子化css)?使用及vue3?+?vite?+?ts講解

    Unocss(原子化css)?使用及vue3?+?vite?+?ts講解

    這篇文章主要介紹了Unocss(原子化css)使用vue3?+?vite?+?ts的方法,簡單介紹了Unocss使用及圖標庫使用,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Vue生成隨機卡密并綁定到表單輸入框的實現(xiàn)技巧

    Vue生成隨機卡密并綁定到表單輸入框的實現(xiàn)技巧

    在現(xiàn)代Web應(yīng)用中,隨機生成驗證碼、卡密等是一項常見需求,對于開發(fā)人員來說,如何在表單中快速生成一個符合格式的隨機卡密,并與其他表單字段一同提交,是一個常見的場景,本篇文章將詳細介紹如何在Vue.js框架中實現(xiàn)一個隨機卡密生成功能,需要的朋友可以參考下
    2024-11-11
  • 淺談Vue單頁面做SEO的四種方案

    淺談Vue單頁面做SEO的四種方案

    Vue SPA單頁面應(yīng)用對SEO不友好,當然也有相應(yīng)的解決方案,通過查找資料,大概有以下4種方法,本文就詳細的介紹一下
    2021-10-10
  • vue將后臺數(shù)據(jù)時間戳轉(zhuǎn)換成日期格式

    vue將后臺數(shù)據(jù)時間戳轉(zhuǎn)換成日期格式

    這篇文章主要為大家詳細介紹了vue將后臺數(shù)據(jù)時間戳轉(zhuǎn)換成日期格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • vue?cli+axios踩坑記錄+攔截器使用方式,代理跨域proxy

    vue?cli+axios踩坑記錄+攔截器使用方式,代理跨域proxy

    這篇文章主要介紹了vue?cli+axios踩坑記錄+攔截器使用方式,代理跨域proxy,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vant picker 多級聯(lián)動操作

    Vant picker 多級聯(lián)動操作

    這篇文章主要介紹了Vant picker 多級聯(lián)動操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vuex unknown action type報錯問題及解決

    Vuex unknown action type報錯問題及解決

    這篇文章主要介紹了Vuex unknown action type報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • vue用BMap百度地圖實現(xiàn)即時搜索功能

    vue用BMap百度地圖實現(xiàn)即時搜索功能

    這篇文章主要為大家詳細介紹了vue用BMap百度地圖實現(xiàn)即時搜索功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • ElementUI中<el-form>標簽中ref、:model、:rules的作用淺析

    ElementUI中<el-form>標簽中ref、:model、:rules的作用淺析

    Element官方文檔中寫到,model是表單數(shù)據(jù)對象,rules是表單驗證規(guī)則,下面這篇文章主要給大家介紹了關(guān)于ElementUI中<el-form>標簽中ref、:model、:rules作用的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • vue事件監(jiān)聽函數(shù)on中的this指針域使用

    vue事件監(jiān)聽函數(shù)on中的this指針域使用

    這篇文章主要介紹了vue事件監(jiān)聽函數(shù)on中的this指針域使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論