vue3 vite pinia配置动态路由、解决刷新页面路由消失的问题

 更新时间:2023年10月23日 09:13:36   作者:解二  
这篇文章主要介绍了vue3 vite pinia配置动态路由、解决刷新页面路由消失的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

实现思路

1,需要在静态路由的基础上用vue路由上面的addRoute()方法来动态添加路由,最后生成我们需要的路由

2,封装添加路由的方法,在刷新页面时重新生成路由

首先创建静态路由

// 静态路由 
export const basicRoutes = [
  {
    path: '/',
    redirect: '/login',
  },
  {
    path: '/login',
    name: 'login',
    component: () => import('@/views/login/index.vue'),
  },
  // 免登录跳转到项目中
  {
    path: '/hideLogin',
    name: 'hideLogin',
    component: () => import('@/views/hideLogin/index.vue'),
  },
  {
    // 异常页面
    path: '/errorPage',
    component: () => import('@/components/error-page/404'),
    name: '404',
  },
]

创建路由的时候引入

import { createRouter, createWebHistory } from 'vue-router'
import { basicRoutes as routes } from './routes' // 引入静态路由
 
export const router = createRouter({
  history: createWebHistory('/'),
  routes,
  scrollBehavior: () => ({ left: 0, top: 0 }),
})
export default router

封装处理路由方法

import { deepClone } from '@/utils/utils' // 深拷贝
import router from './index'
// 处理路由展示列表树形格式 (如果所有路由数据是在同一级,需要调用这个方法)
export const formatRouterTree = (data) => {
  let parents = data.filter((i) => i.pid === 0),
    children = data.filter((item) => item.pid !== 0)
  dataToTree(parents, children)
  function dataToTree(parents, children) {
    parents.map((p) => {
      children.map((c, i) => {
        let _c = deepClone(children)
        _c.splice(i, 1)
        dataToTree([c], _c)
        if (p.children) {
          p.children.push(c)
        } else {
          p.children = [c]
        }
      })
    })
  }
}
 
// vite中获取文件
const modules = import.meta.glob([
  '../views/*.vue',
  '../views/*/*.vue',
  '../views/*/*/*.vue',
  '../components/layout/index.vue',
])
 
// 处理路由所需格式
export const generateRouter = (userRouters) => {
  let newRouter = null
  if (userRouters)
    newRouter = userRouters.map((i) => {
      let routes = {
        path: i.pathUrl,
        name: i.name,
        // meta: i.meta,
        component:
          i.pathUrl === '/layout'
            ? modules[`../components/layout/index.vue`]
            : modules[`../views${i.pathUrl}/index.vue`],
      }
      if (i.children) {
        routes.children = generateRouter(i.children)
      }
      return routes
    })
  return newRouter
}
 
/**
 * 添加动态路由
 */
export function setAddRoute(routes) {
  if (routes && routes.length > 0)
    routes.forEach((route) => {
      const routeName = route.name
      if (!router.hasRoute(routeName)) router.addRoute(route)
    })
}

在store中写一个调用方法

import { defineStore } from 'pinia'
import { generateRouter, setAddRoute } from '@/router/vue-router.js'
export const routeStore = defineStore('route', {
  state: () => {
    return {
    }
  },
  actions: {
    addRouter() {
      // 生成路由树
      // routerList在登陆成功时获取到,在跳转页面之前存起来
      let find = JSON.parse(window.localStorage.getItem('routerList'))
      let routerList = generateRouter(find)
      // 添加路由
      setAddRoute(routerList)
    },
  },
  getters: {},
})

登陆时存储路由信息

import { generateRouter, setAddRoute } from '@/router/vue-router.js'
 
Login.Login(params).then(async (res) => {
     if (res.code === 200) {
        // 存用户信息、token等,这里不写了
 
        // 调接口获取路由信息 params传当前用户角色来获取对应的路由信息
        let routerList = await getRouterList(params)
        // 存储路由信息
        window.localStorage.setItem('routerList', routerList)
        
        // 生成路由树
        let list = generateRouter(routerList)
        // 添加路由
        setAddRoute(list)
        
        // 最后跳转到首页并提示
        router.push('首页')
        ElMessage.success('登陆成功')
     }  
})

解决刷新消失

上面只是在登陆时候添加了路由,点击刷新页面后会消失,需要在main.js中配置一下

import { createPinia } from 'pinia'
import { routeStore } from '@/store/modules/routeMenu.js' // 这个是我的store里面的方法路径
const store = createPinia()
const app = createApp(App)
app.use(store)
let routeStores = routeStore()
const addRouter = () => {
  routeStores.addRouter()
}
addRouter()
// router要在添加完路由之后引入,不然还没添加,路由已经生成了
app.use(router)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于el-select组件设置默认值的实现方式

    关于el-select组件设置默认值的实现方式

    这篇文章主要介绍了关于el-select组件设置默认值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue打包优化之生产环境删除console日志配置

    Vue打包优化之生产环境删除console日志配置

    这篇文章主要为大家介绍了Vue打包优化之生产环境删除console日志配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Vue计算属性的学习笔记

    Vue计算属性的学习笔记

    这篇文章主要为大家详细介绍了Vue计算属性的学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vue axios 给生产环境和发布环境配置不同的接口地址(推荐)

    vue axios 给生产环境和发布环境配置不同的接口地址(推荐)

    这篇文章主要介绍了vue axios 给生产环境和发布环境配置不同的接口地址,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • 在Vue中使用防抖与节流,及this指向的问题

    在Vue中使用防抖与节流,及this指向的问题

    这篇文章主要介绍了在Vue中使用防抖与节流,及this指向的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Vue中的请求拦截器和响应拦截器用法及说明

    Vue中的请求拦截器和响应拦截器用法及说明

    这篇文章主要介绍了Vue中的请求拦截器和响应拦截器用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue.js第三天学习笔记(计算属性computed)

    Vue.js第三天学习笔记(计算属性computed)

    这篇文章主要为大家详细介绍了Vue.js第三天的学习笔记,vue.js计算属性computed,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • vue中v-model对select的绑定操作

    vue中v-model对select的绑定操作

    这篇文章主要介绍了vue中v-model对select的绑定操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue3版本网页小游戏设计思路

    vue3版本网页小游戏设计思路

    最近火爆全网的羊了个羊小程序,背景是根据官方介绍,“羊了个羊”是一款闯关消除小游戏,通关率不到0.1%。主要玩法为重叠的各类方块,需要在下方7个栏内完成消除,其特点就是“极难”,也因此成为热门挑战,对vue3版本网页小游戏设计思路感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • Vuex利用state保存新闻数据实例

    Vuex利用state保存新闻数据实例

    本篇文章主要介绍了Vuex利用state保存新闻数据实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论