最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vite+vue3+pinia實現(xiàn)動態(tài)注冊懶加載路由教程

 更新時間:2025年04月28日 14:16:35   作者:Tt濤㏒  
這篇文章主要介紹了vite+vue3+pinia實現(xiàn)動態(tài)注冊懶加載路由教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

模塊版本

  • vite:^5.4.10
  • vue:^3.5.12
  • vue-router:^4.4.5
  • pinia:^2.2.6
  • pinia-plugin-persistedstate:^4.1.3(pinia持久化插件)

業(yè)務需求說明

每個程序都要滿足不同的業(yè)務需求,以下代碼只是滿足我當前的業(yè)務需求

  • 后端保存了每個用戶的前端路由列表信息
  • 前端默認路徑為’/login’,比如www.xxxx.com訪問默認顯示login頁面
  • 前端默認注冊靜態(tài)路由’/login’,并重定向到路徑’/’
  • 用戶點擊登錄后獲取路由列表,通過addRoute注冊路由

router代碼

import {createRouter, createWebHistory} from 'vue-router'
import type {Router} from 'vue-router'

const router: Router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      component: () => import('@/views/Login.vue')
    },
    {
      path: '/login',
      name: 'login',
      meta: {
        navBar: false,
        token: false
      },
      component: () => import('@/views/Login.vue')
    }
  ],
})

export default router

Login頁面(ts+setup)

<script lang="ts" setup>
  import {ref} from "vue"
  import {useRouter} from 'vue-router'
  import {loginApi} from '@/api/login/loginApi'
  import {useUserInfo, useMyToken} from '@/stores/counter'
  import type {RouterListItem} from '@/types/login'

  const userInfo = useUserInfo()
  const myToken = useMyToken()
  const router = useRouter()

  /** 用戶輸入賬號 */
  const userName = ref<string>('')
  /** 用戶輸入的密碼 */
  const password = ref<string>('')

  /** 登錄API */
  const logon = async () => {
    /** 發(fā)送登錄請求,攜帶用戶賬號和密碼信息 */
    loginApi(userName.value, password.value).then((res) => {
      /** 后端返回的用戶信息和路由列表,寫入pinia */
      userInfo.setUserInfo(res.result.info)
      /** 用戶token信息,寫入pinia */
      myToken.setMyToken(res.result.token)
      /** 調(diào)取pinia內(nèi)的方法注冊路由 */
      userInfo.registeredRoute()
      /** 由于后端返回的路由列表是JSON格式,需要轉換 */
      let routerListArr: RouterListItem[] = []
      if (userInfo.userInfo !== undefined) {
        /** 轉換路由信息 */
        routerListArr = JSON.parse(userInfo.userInfo?.router_list)
      }
      /** 跳轉到用戶路由列表中的第一個路由 */
      router.replace(routerListArr[0].path)
    }, (err) => {
      /** 錯誤提示 */
      ElMessage({
        message: err.response.data.message,
        type: 'error'
      })
    })
  }
</script>

pinia代碼

import {ref} from 'vue'
import {defineStore} from 'pinia'
import type {RouterListItem, UserInfo} from '@/types/login'
/** 導入的是自己的路由文件 src-router-index.ts */
import myRouter from '@/router/index'

/** 用戶信息相關 */
export const useUserInfo = defineStore(
  'userInfo',
  () => {
    /** 用戶信息 */
    const userInfo = ref<UserInfo | undefined>(undefined)
    
    /** 存儲用戶信息方法 */
    const setUserInfo = (info: UserInfo): void => {
      userInfo.value = info
    }
    /** 清除用戶信息方法-用于退出登錄或token驗證失敗 */
    const clearUserInfo = (): void => {
      userInfo.value = undefined
    }
    /** 注冊路由方法 */
    const registeredRoute = () => {
      /** 判斷userInfo.value是否為undefined,不是則進入 */ 
      if (userInfo.value !== undefined) {
        /** 由于我的后端返回路由列表是JSON格式,需要轉換后使用 */
        const routerListArr: RouterListItem[] = JSON.parse(userInfo.value?.router_list)
        /** 通過循環(huán)添加路由 */
        for (const item of routerListArr) {
          const route = {
            path: item.path,
            name: item.name,
            meta: {
              navBar: item.meta.navBar,
              token: item.meta.token
            },
            /** 懶加載導入vue頁面
                由于我的后端返回的component名稱是帶有后綴名的,直接導入vite會報警告,雖然不影響使用,但是安全起見
                還是替換了為好,這里使用replace將.vue替換為空
            */
            component: () => import(`../views/${item.component.replace('.vue', '')}.vue`)       
          }
          myRouter.addRoute(route)
        }
      }
    }
    
    return {
      userInfo,
      setUserInfo,
      clearUserInfo,
      registeredRoute
    }
  },
  { 
     /** pinia持久化 */
    persist: true
  })

/** 用戶token相關 */
export const useMyToken = defineStore(
  'myToken',
  () => {
    /** token信息 */
    const myToken = ref<string | undefined>(undefined)
   
    /** 存儲token信息方法 */
    const setMyToken = (token: string) => {
      myToken.value = token
    }
    /** 清除token信息方法-用于退出登錄或token驗證失敗 */
    const clearMyToken = () => {
      myToken.value = undefined
    }
    
    return {
      myToken,
      setMyToken,
      clearMyToken
    }
  },
  {
    /** pinia持久化 */
    persist: true
  })

關于替換.vue后綴的說明

導入必須以 或 開頭。./…/

所有導入都必須相對于導入文件開始。導入不應以變量、絕對路徑或裸導入開頭:

// Not allowed
import(bar);
import(`${bar}.js`);
import(`/foo/${bar}.js`);
import(`some-library/${bar}.js`);

導入必須以文件擴展名結尾

文件夾可能包含您不打算導入的文件。因此,我們要求導入在導入的靜態(tài)部分中以文件擴展名結尾。

// Not allowed
import(`./foo/${bar}`);
// allowed
import(`./foo/${bar}.js`);

導入到您自己的目錄必須指定文件名模式

如果您導入自己的目錄,則最終可能會得到您不打算導入的文件,包括您自己的模塊。因此,需要提供更具體的文件名模式:

// not allowed
import(`./${foo}.js`);
// allowed
import(`./module-${foo}.js`);

詳細信息見文檔:dynamic-import-vars#limitations

main代碼(vue的main.ts文件內(nèi))

import './assets/main.css'
import {createApp} from 'vue'
import App from './App.vue'
import router from './router'
/** 導入createPinia用于創(chuàng)建pinia */
import {createPinia} from 'pinia'
/** 導入ElementPlus */
import ElementPlus from 'element-plus'
/** 導入ElementPlus國際化文件-中文 */
import zhCn from 'element-plus/es/locale/lang/zh-cn'
/** 導入pinia持久化插件 */
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
/** 導入pinia內(nèi)的useUserInfo,用于動態(tài)注冊路由 */
import {useUserInfo} from '@/stores/counter'
/** 導入el-loading樣式 */
import 'element-plus/theme-chalk/el-loading.css'
/** 導入el-message樣式 */
import 'element-plus/theme-chalk/el-message.css'
import type {Pinia} from 'pinia'


const app = createApp(App)
/** 創(chuàng)建pinia */
const pinia: Pinia = createPinia()
/** 注冊piniaPluginPersistedstate持久化插件 */
pinia.use(piniaPluginPersistedstate)
/** 注冊pinia */
app.use(pinia)
/** 獲取pinia內(nèi)的userInfo,用于動態(tài)注冊路由 */
const userInfo = useUserInfo()
/** 動態(tài)注冊路由,并且防止刷新頁面導致路由丟失
    這里直接調(diào)用userInfo.registeredRoute()會不生效,需要寫到函數(shù)內(nèi)部,再調(diào)用函數(shù)
    并且需要寫在app.use(router)之前
 */
const addRouter = () => {
  userInfo.registeredRoute()
}
addRouter()
app.use(router)

/** 注冊ElementPlus,并使用中文模式 */
app.use(ElementPlus, {
  locale: zhCn,
})


app.mount('#app')

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • vue2.0與vue3.0及vue與react的區(qū)別及說明

    vue2.0與vue3.0及vue與react的區(qū)別及說明

    這篇文章主要介紹了vue2.0與vue3.0及vue與react的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue中echarts視圖不更新問題及解決

    vue中echarts視圖不更新問題及解決

    這篇文章主要介紹了vue中echarts視圖不更新問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • printJS打印問題匯總以及解決辦法

    printJS打印問題匯總以及解決辦法

    Print.js一個小的javascript庫,可幫助您從網(wǎng)絡上打印,這篇文章主要給大家介紹了關于printJS打印問題匯總以及解決辦法的相關資料,文中介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • 解決Vue 項目打包后favicon無法正常顯示的問題

    解決Vue 項目打包后favicon無法正常顯示的問題

    今天小編就為大家分享一篇解決Vue 項目打包后favicon無法正常顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue獲取參數(shù)的幾種方式總結

    vue獲取參數(shù)的幾種方式總結

    這篇文章主要介紹了vue獲取參數(shù)的幾種方式總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue多層數(shù)據(jù)結構響應式失效,視圖更新失敗問題

    Vue多層數(shù)據(jù)結構響應式失效,視圖更新失敗問題

    這篇文章主要介紹了Vue多層數(shù)據(jù)結構響應式失效,視圖更新失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • vue3關于時間顯示格式化的問題

    vue3關于時間顯示格式化的問題

    這篇文章主要介紹了vue3關于時間顯示格式化的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 深入解讀VUE中的異步渲染的實現(xiàn)

    深入解讀VUE中的異步渲染的實現(xiàn)

    這篇文章主要介紹了深入解讀VUE中的異步渲染的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Vue中created和mounted使用詳解

    Vue中created和mounted使用詳解

    Vue中生命周期包括多個階段,如created和mounted,每階段有特定鉤子函數(shù),生命周期與瀏覽器渲染過程密切相關,了解這些可以優(yōu)化頁面渲染和數(shù)據(jù)處理,created階段適用于數(shù)據(jù)初始化,而mounted階段適合進行DOM操作和頁面渲染后的處理
    2024-10-10
  • vue+element實現(xiàn)下拉菜單并帶本地搜索功能示例詳解

    vue+element實現(xiàn)下拉菜單并帶本地搜索功能示例詳解

    這篇文章主要介紹了vue+element實現(xiàn)下拉菜單并帶本地搜索功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論

泗洪县| 怀远县| 偃师市| 鸡西市| 灵山县| 株洲市| 定远县| 灌云县| 中超| 澳门| 修文县| 普定县| 浦城县| 特克斯县| 博野县| 米脂县| 新兴县| 清丰县| 嘉义县| 高唐县| 漾濞| 麻阳| 凤城市| 新营市| 沭阳县| 白水县| 禹州市| 新田县| 通江县| 德保县| 龙江县| 虞城县| 宝清县| 环江| 高碑店市| 老河口市| 盐山县| 明光市| 罗甸县| 剑川县| 仙桃市|