vue-router相关(持续更新中)

文章目录

router-view

javascript 复制代码
<router-view></router-view>

router-view 是Vue Router中的一个组件,用于渲染匹配到的路由组件。它是用来显示当前路由对应的组件内容的占位符 。 即当前路由组件会在占位符对应位置显示出来。
<router-view></router-view> 标签将会根据当前路由的路径匹配到相应的路由组件,并将其内容渲染在这个位置。

router-view的嵌套

<router-view></router-view>中嵌套一层<router-view></router-view>标签可以用来渲染路由的子路由。

可以在不同的层级使用 <router-view> 来渲染每个嵌套路由对应的组件。外部的 <router-view> 负责渲染父级路由的组件,而位于父组件内部的内部 <router-view> 负责渲染子级路由的组件。

假设你有一个父级路由 /home 和一个子级路由 /home/profile 。当用户导航到 /home 时,与 /home 路由关联的组件将在外部的 <router-view> 中渲染。然后,如果用户导航到 /home/profile ,与 /home/profile 路由关联的组件将在父组件内部的内部 <router-view> 中渲染。

router.addRoute

router.addRoute 可以动态添加一条新路由。

javascript 复制代码
router.addRoute(route: RouteConfig): () => void

router.addRoute 还可以为现有路由添加子路由。

javascript 复制代码
router.addRoute(parentName: string, route: RouteConfig): () => void

复杂嵌套实例

采用动态路由的方式添加路由,根据后端返回的路由信息动态渲染路由菜单,根据路由信息在不同的 <router-view> 位置加载不同的组件

系统静态路由如下:

javascript 复制代码
export const staticRouter: RouteRecordRaw[] = [
  {
    path: "/",
    redirect: HOME_URL
  },
  {
    path: LOGIN_URL,
    name: "login",
    component: () => import("@/views/login/index.vue"),
    meta: {
      title: "登录"
    }
  },
  {
    path: "/layout",
    name: "layout",
    component: () => import("@/layouts/index.vue"),
    // component: () => import("@/layouts/indexAsync.vue"),
    redirect: HOME_URL,
    children: []
  }
];

通过调用api获取路由信息,json数据如下:

javascript 复制代码
{
  "code": 200,
  "data": [
    {
      "path": "/home/index",
      "name": "home",
      "component": "/home/index",
      "meta": {
        "icon": "HomeFilled",
        "title": "首页",
        "isLink": "",
        "isHide": false,
        "isFull": false,
        "isAffix": true,
        "isKeepAlive": true
      }
    },
    {
      "path": "/test/vslot",
      "name": "vslot",
      "component": "/test/vslot-test/a",
      "meta": {
        "icon": "Histogram",
        "title": "vslot-test",
        "isLink": "",
        "isHide": false,
        "isFull": false,
        "isAffix": false,
        "isKeepAlive": true
      }
    }

使用router.addRoute动态添加路由

authStore.flatMenuListGet方法用于获取每一个路由,并且将子路由合并成一维数组,即做数组扁平化处理

通过判断item.meta.isFull,如果是false,则为layout的子路由,在内部 <router-view> 中显示,如果是true,则直接加入路由中,与layout同级,在第一层 <router-view> 中显示,即覆盖全屏

javascript 复制代码
import router from "@/routers/index";
import { useAuthStore } from "@/stores/modules/auth";

/**
 * @description 初始化动态路由
 */
export const initDynamicRouter = async () => {
  const authStore = useAuthStore();
  try {  
    authStore.flatMenuListGet.forEach(item => {
      item.children && delete item.children;
      if (item.component && typeof item.component == "string") {
        item.component = modules["/src/views" + item.component + ".vue"];
      }
      if (item.meta.isFull) {
        router.addRoute(item as unknown as RouteRecordRaw);
      } else {
        router.addRoute("layout", item as unknown as RouteRecordRaw);
      }
    });
  } catch (error) {
    // 当按钮 || 菜单请求出错时,重定向到登陆页
    userStore.setToken("");
    router.replace(LOGIN_URL);
    return Promise.reject(error);
  }
};

则最终的效果是在app.vue中有一个 <router-view> 占位符,会渲染Login、layout等组件,在layout内部的Main组件中嵌套一个 <router-view> 占位符,则会渲染layout组件的子路由,包括动态加入的路由

总结

即通过 <router-view> 的嵌套,实现了父路由和其children数组中路由对应组件的对应显示位置及效果,当前路由切换时,如果是子路由,则只会在内部的 <router-view> 部分进行更新。

相关推荐
海盐泡泡龟4 分钟前
Javascript本地存储的方式有哪些?区别及应用场景?(含Deep Seek讲解)
开发语言·javascript·ecmascript
11054654011 小时前
23、电网数据管理与智能分析 - 负载预测模拟 - /能源管理组件/grid-data-smart-analysis
前端·能源
开发者小天1 小时前
React中startTransition的使用
前端·react.js·c#
@PHARAOH2 小时前
WHAT - 缓存命中 Cache Hit 和缓存未命中 Cache Miss
前端·缓存
计算机学姐2 小时前
基于SpringBoot的小型民营加油站管理系统
java·vue.js·spring boot·后端·mysql·spring·tomcat
Elastic 中国社区官方博客2 小时前
JavaScript 中使用 Elasticsearch 的正确方式,第一部分
大数据·开发语言·javascript·数据库·elasticsearch·搜索引擎·全文检索
万物得其道者成3 小时前
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
开发语言·javascript·ecmascript
海天胜景3 小时前
无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
MingT 明天你好!3 小时前
在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查
前端·npm·node.js·visual studio code
老兵发新帖3 小时前
pnpm 与 npm 的核心区别
前端·npm·node.js