vue3+ts+vite实现动态路由(包括解决刷新页面路由丢失)

router/index.ts

import{createRouter,createWebHistory,RouteRecordRaw} from 'vue-router';
import {getToken,getRouters} from "@/store/cache";
import store from "@/store/store";
let moduleView = import.meta.globEager('../views/**/**.vue');
let layoutView = import.meta.globEager('../views/**.vue');


//配置一些公共路由
const routes:Array<RouteRecordRaw>=[
    {
        path:'/login',
        name:'login',
        component: () => moduleView['../views/login/index.vue'],
        meta:{
            title:'用户登录'
        }
    },{
        path:'/',
        name:'layout',
        redirect: '/product',
        component: () => layoutView['../views/home.vue'],
        children: []
    },{
        path:'/404',
        name:'404',
        component: () => layoutView['../views/404.vue'],
        meta:{
            title:'404'
        }
    }
]
const router = createRouter({
    history:createWebHistory(),
    routes
})


//模拟后台返回路由数据 为了方便查看就写在一个文件里
let routerList = [{
    name:'home',
    path:'/home',
    mate:{
        title:'首页',
    }
},{
    name:'product',
    path:'/product',
    mate:{
        title:'产品列表',
    }
},{
    name:'news',
    path:'/news',
    mate:{
        title:'新闻列表',
    }
}]


router.beforeEach((to,from,next)=>{//beforeEach是router的钩子函数,在进入路由前执行
    const isLoadRouters = store.state.asyncRoutesMark
    let token = getToken();
    let routers;

    //这是我实际中的动态路由数据 现在使用routerList
    //if(getRouters() && getRouters() != 'undefined'  ){
    //    routers = JSON.parse(getRouters());
    //}

    // 有token routers
    if (to.path == '/login') {
        next()
    } else {
        //用户已登录
        if (token && JSON.stringify(routerList) != '[]' ) {
            if (isLoadRouters) {
                console.log('路由已添加,直接跳转到目标页面')
                next()
            } else {
                //解决刷新页面空白
                console.log('重新加载路由,并跳转到目标页')

                store.commit('setRouters', routers)
                store.commit('setAsyncRoutesMark', true)

                //添加路由 在layout中添加子路由
                const layout:any = routes.find((item) => item.name == 'layout')!;
                routerList.forEach((item:any )=> {
                    layout.children.push({
                        path: item.path,
                        name: item.name,
                        component: () => moduleView[`../views${item.path}/index.vue`],
                        meta: {
                            title: item.meta.title,
                        },
                    })
                })
                //这个要在动态中配置 不然会出现空白页的情况
                layout.children.push({
                    path: '/:pathMatch(.*)',
                    redirect: '/404',
                    component: () => moduleView[`../views${404}.vue`],
                    meta: {
                        title: '404',
                    },
                })
                router.addRoute(layout)
                next({ ...to, replace: true })
            }
        } else {
            console.log('无登录信息,跳转到登录页');
            store.commit('setAsyncRoutesMark', false)
            next(`/login`)
        }
    }
})
export default router

 store/index.ts (使用全局变量来控制动态路由是否需要添加)

import {createStore} from "vuex";
import persistedState from 'vuex-persistedstate'

export default createStore({
    state:{
        asyncRoutesMark: false,
    },
    mutations: {
        
        setAsyncRoutesMark(state, data) {
            state.asyncRoutesMark = data
        },
    },
    plugins: [persistedState()]
})

 在main.ts中引入

import { createApp} from 'vue'
import App from './App.vue'
import router from './router/index'


const app = createApp(App)
const setupAll = async () => {
    app.use(router).mount('#app')
}
setupAll()

最后一个重点

写在App.vue里 (因为页面刷新之后动态路由会丢失 所以必须初始化控制动态路由是否需要添加的变量)

window.addEventListener('beforeunload', e => beforeunloadFn(e))
const beforeunloadFn = (()=> {
  store.commit('setAsyncRoutesMark',false)
})

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Vue 3.x、TypeScriptVite都支持使用路由。您可以使用Vue Router 4.x来实现路由功能。下面是一个简单的示例,展示了如何在Vue 3.x、TypeScriptVite中使用路由: 1. 首先,您需要安装Vue Router和相关的依赖。您可以使用以下命令来安装它们: ``` npm install vue-router@4.x ``` 2. 在您的Vue 3.x项目中,创建一个router.ts文件,并在其中定义路由配置。以下是一个基本的示例: ```typescript import { createRouter, createWebHistory } from 'vue-router'; // 导入组件 import Home from './views/Home.vue'; import About from './views/About.vue'; const routes = [ { path: '/', component: Home }, { path: '/about', component: About } ]; const router = createRouter({ history: createWebHistory(), routes }); export default router; ``` 3. 在入口文件(main.ts)中,将路由添加到Vue应用中: ```typescript import { createApp } from 'vue'; import App from './App.vue'; import router from './router'; createApp(App).use(router).mount('#app'); ``` 4. 创建两个组件,Home.vue和About.vue,分别表示首页和关于页面。您可以根据自己的需求进行修改和扩展。 5. 最后,在模板文件中使用<router-link>和<router-view>标签来实现路由导航和内容渲染。例如,在App.vue中可以这样使用: ```html <template> <div> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> <router-view></router-view> </div> </template> ``` 通过以上步骤,您就可以在Vue 3.x、TypeScriptVite环境下成功使用路由了。请注意,这只是一个简单的示例,您可以根据自己的需求进行路由配置和页面组件的编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值