1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Vue路由的动态添加和缓存

Vue路由的动态添加和缓存

时间:2022-03-10 15:12:21

相关推荐

Vue路由的动态添加和缓存

1.addRouter和addRouters

二者都是动态添加路由。其中addRouters和addRouter的用法差不多,只不过addRouters中要传入数组

router.addRouters(routerData)

而且,addRouters 马上会被删除。

2.动态添加路由。

在路由中配置

router.beforeEach((to, from, next) => {if (store && store.state.routerNav.length == 0) {let data = routerdata//操作后端传来的数据let routerData = navadd(data)//添加路由router.addRoutes(routerData)//缓存路由mit("addRouterData", data)//跳转next({ ...to })} else {next()}})//操作后端传来的数据function navadd(e) {let routerArrData = []e.forEach(v => {routerArrData.push({path: v.path,name: v.name,component: () => import('@/views' + v.path + '.vue')})});return routerArrData}

解释:

定义一个data来接受后端传进来的值。写一个函数 navadd 来处理函数传进来的值,使其能够符合路由的格式。利用 addRouters 添加路由路由

以上就是动态的添加路由。但是你会发现如果刷新页面,动态添加的路由会消失。这是由于页面刷新时,路由重新初始化,动态添加的路由此时已不存在,只有一些固定路由(比如登录页面)还在。所以要利用路由钩子 beforeEach 来重新添加,因为 beforeEach 每次刷新页面会重新执行。

但是如果不限制,则每次跳转都会请求一次数据,所以要用到vuex。

那么接下来就要缓存路由。

在vuex中定义一个state,名为routerNav:[] ;

state:{

routerNav:[]

},

再在mutation中定义一个方法来修改routerNav:[]。

mutations:{

addRouterData(state,data){

state.routerNav=data

}

},

并在router中使用,判断store和store中state的routerNav的长度是否为零来判断是否重新请求数据。并且可以通过

mit("addRouterData",data)

来缓存路由,使其可以在其他页面使用。

3.下面是完整代码:

1.一开始就跳转的静态页面home

<template><div><div v-for="v in routerNav" :key="v.name"><router-link :to="v.path">{{ v.name }}</router-link></div></div></template><script>import { mapState } from "vuex";export default {name: "home",data() {return {//一开始模拟的数据//showdata: ["a", "b", "c", "d", "e"],};},computed: {...mapState(["routerNav"]),},};</script><style scoped></style>

2.模拟的数据页面routerconfig

let config = [{path: '/a',name: 'a',component: () => import('@/views/a.vue')}, {path: '/b',name: 'b',component: () => import('@/views/b.vue')}, {path: '/c',name: 'c',component: () => import('@/views/c.vue')}, {path: '/d',name: 'd',component: () => import('@/views/d.vue')}, {path: '/e',name: 'e',component: () => import('@/views/e.vue')}]export default config

3.Router页面

import Vue from 'vue'import VueRouter from 'vue-router'import routerdata from '../config/routerConfig'import store from "@/store/index"Vue.use(VueRouter)const routes = [{path: '/',name: 'home',component: () => import('@/views/home.vue')},]const router = new VueRouter({routes,history})router.beforeEach((to, from, next) => {console.log(212121321321);if (store && store.state.routerNav.length == 0) {let data = routerdata//操作后端传来的数据let routerData = navadd(data)//添加路由router.addRoutes(routerData)//缓存路由mit("addRouterData", data)//跳转next({ ...to })} else {next()}})//操作后端传来的数据function navadd(e) {let routerArrData = []e.forEach(v => {routerArrData.push({path: v.path,name: v.name,component: () => import('@/views' + v.path + '.vue')})});return routerArrData}export default router

4.vuex页面

import Vue from 'vue'import Vuex from 'vuex'import { config } from '../config/routerConfig'Vue.use(Vuex)export default new Vuex.Store({state: {routerNav: []},getters: {},mutations: {addRouterData(state, data) {state.routerNav = data}},actions: {},modules: {}})

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。