abstract 路由模式
abstract 是vue路由中的第三种模式,自身是用来在不反对浏览器API的环境中,充当fallback,而不论是hash还是history模式都会对浏览器上的url产生作用,本文要实现的性能就是在已存在的路由页面中内嵌其余的路由页面,而放弃在浏览器当中仍旧显示以后页面的路由path,这就利用到了abstract这种与浏览器拆散的路由模式。
路由示例
export const routes = [ { path: "/", redirect: "abstract-route", }, { path: "/embed-route", name: "embedded", component: () => import(/* webpackChunkName: "embed" */ "../views/embed.vue"), }, { path: "/abstract-route", name: "abstract", component: () => import(/* webpackChunkName: "abstract" */ "../views/abstract.vue"), },];const router = new VueRouter({ mode: "history", base: process.env.BASE_URL, routes,});
本次示例有两个路由,别离为abstract,embedded,其中abstract视图上开展一个抽屉,抽屉当中显示embedded的视图。即:
// abstract views<template> <div> <RouterDrawer :visible.sync="visible" :path="{ name: 'embedded' }" size="50%" title="drawer comps" ></RouterDrawer> <el-button @click="visible = true">open drawer</el-button> </div></template>// embedded views<template> <div> embedded views </div></template>
router-drawer 封装
以后我的项目默认是history 的路由模式,因而在进入abstract页面时,浏览器Url为http://127.0.0.1:8010/abstract-route,而router-drawer要做的是在此基础上,从新实例化一个abstract模式的路由,而后在组件当中利用<router-view />
去挂载要被内嵌的指标页面。即:
<template> <el-drawer :visible.sync="visible" v-bind="$attrs" :before-close="handleClose" > <router-view /> </el-drawer></template><script>import { routes } from "../router/index";import VueRouter from "vue-router";export default { name: "router-drawer", props: { path: { type: Object, required: true, }, visible: { type: Boolean, required: true, default: false, }, }, // 此处实例化一个新的router来配合以后页面的router-view router: new VueRouter({ mode: "abstract", base: "/", routes, }), methods: { handleClose() { this.$emit("update:visible", false); }, }, mounted() { console.log("drawer router", this.$router); this.$router.push(this.path); },};</script>
通过打印日志能够得出两个实例化的路由:
这样即可实现在不扭转以后页面path的前提下加载其余路由中的views了。
代码示例