【Vue工程】005-Vue Router

news2024/11/19 10:33:25

【Vue工程】005-Vue Router

文章目录

  • 【Vue工程】005-Vue Router
  • 一、概述
    • 1、Slogan
    • 2、官网
    • 3、参考文章
  • 二、安装
  • 三、基本使用
    • 1、定义路由
    • 2、创建路由实例
    • 3、在 `main.ts` 注册路由
    • 4、在 `App.vue` 定义路由出口
  • 四、嵌套路由
    • 1、修改路由
    • 2、定义嵌套路由出口
  • 五、配置404页面
  • 六、声明式、编程式导航
    • 1、声明式导航(在模板中进行路由跳转)
    • 2、编程式导航(组合式API)
  • 七、重定向
  • 八、路由跳转传参
    • 1、动态路由匹配
      • 路由配置
      • 当前组件:传参
      • 跳转目标组件:接收参数
      • 运行结果
      • 路由嵌套刷新页面策略
    • 2、查询参数
      • 路由配置
      • 当前组件:传参
      • 跳转目标组件:接收参数
      • 运行结果
  • 九、导航守卫
    • 1、全局前置守卫
    • 2、路由独享守卫
    • 3、组件内守卫
  • 十、路由元信息
  • 十一、router-link
  • 十二、动态路由
    • 1、修改 `router/routes.ts`
    • 2、修改 `pages/login.vue`
    • 3、修改 `App.vue`

一、概述

1、Slogan

为 Vue.js 提供富有表现力、可配置的、方便的路由。

2、官网

https://router.vuejs.org/zh/

3、参考文章

人家写得太好,没多少可改的,部分内容直接摘录。

https://juejin.cn/post/7223779544368627773

二、安装

pnpm add vue-router

三、基本使用

1、定义路由

创建文件 src/router/routes.ts

const routes = [
  {
    path: '/',
    component: () => import('@/pages/login.vue'),
  },
  {
    path: '/home',
    component: () => import('@/pages/home.vue'),
  },
];

export default routes;

src/pages/login.vue

<template>
  <div>登录</div>
</template>

<script lang="ts" setup></script>

<style scoped></style>

src/pages/home.vue

<template>
  <div>home</div>
</template>

<script lang="ts" setup></script>

<style scoped></style>

2、创建路由实例

创建文件 src/router/index.ts

import { createRouter, createWebHistory } from 'vue-router';
import routes from './routes';

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

3、在 main.ts 注册路由

import { createApp } from 'vue';
import './style.css';
import App from './App.vue';
// 导入路由
import router from './router';

const app = createApp(App);

// 注册路由
app.use(router);

app.mount('#app');

4、在 App.vue 定义路由出口

<template>
  <!--  写法一-->
  <!--  <router-view v-slot="{ Component }">-->
  <!--    <transition name="fade" mode="out-in">-->
  <!--      <component :is="Component" />-->
  <!--    </transition>-->
  <!--  </router-view>-->
  <!--  写法二-->
  <router-view />
</template>

<style></style>

四、嵌套路由

在 App.vue 中定义的 router-view,这是顶层的出口,渲染最高级路由匹配到的组件。

如果要实现登录之后左侧菜单栏不变,右侧随路由的切换变化显示的内容,需使用嵌套路由。

1、修改路由

修改文件 src/router/routes.ts

其他 vue 文件此处省略。

const routes = [
  {
    path: "/login",
    component: () => import("@/pages/login.vue"),
  },
  {
    path: "/home",
    component: () => import("@/pages/home.vue"),
    children: [
      {
        path: "/home/user",
        component: () => import("@/pages/user.vue"),
      },
      {
        path: "/home/manage",
        component: () => import("@/pages/manage.vue"),
      },
    ],
  },
];

export default routes;

2、定义嵌套路由出口

修改 src/pages/home.vue

<template>
  <div>
    菜单栏
    <router-view />
  </div>
</template>

五、配置404页面

修改router/routes.ts

const routes = [
  {
    path: '/',
    component: () => import('@/pages/login.vue'),
  },
  {
    path: '/home',
    component: () => import('@/pages/home.vue'),
  },
  {
    path: '/:pathMatch(.*)*',
    component: () => import('@/pages/notFound.vue'),
  },
];

export default routes;

六、声明式、编程式导航

1、声明式导航(在模板中进行路由跳转)

<router-link to="/home"> 跳转home </router-link>;

2、编程式导航(组合式API)

<script setup lang="ts">
import { useRouter } from 'vue-router';

const router = useRouter();

const handleManage = () => {
  router.push('/home/manage');
};
</script>

七、重定向

场景:在嵌套路由中,当访问 / 时想重定向到/home

修改router/routes.ts

{
    path: '/home',
    component: () => import('@/pages/home.vue'),
    redirect: '/home/user', // 新增
    children: [
      {
        path: '/home/user',
        component: () => import('@/pages/user.vue'),
      },
      {
        path: '/home/manage',
        component: () => import('@/pages/manage.vue'),
      },
    ],
},

八、路由跳转传参

我的另一篇文章:https://blog.csdn.net/qq_29689343/article/details/130172191

1、动态路由匹配

路由配置

const routes: RouteRecordRaw[] = [
  {
    path: '/',
    name: 'Hello',
    component: Hello,
  },
  {
      path: '/next-page/:message',
      name: 'NextPage',
      component: NextPage,
  },
];

当前组件:传参

<template>
  <button @click="toNextPage">toNextPage</button>
</template>

<script setup lang="ts">
import {useRouter} from 'vue-router';
// 得到 router 对象
const router = useRouter();
// 页面跳转
const toNextPage = () => {
  router.push({name: 'NextPage', params: {message: "基本字符串"}});
}
</script>

跳转目标组件:接收参数

<template>
  <h1>NextPage</h1>
  <h1>基本数据:{{ route.params.message }}</h1>
</template>

<script setup lang="ts">
import { useRoute } from "vue-router";
import {onMounted} from "vue";
const route = useRoute();
</script>

运行结果

image-20230415164331534

路由嵌套刷新页面策略

<template>
  <h1>NextPage</h1>
  <h1 :key="thisVersion">基本数据:{{ route.params.message }}</h1>
</template>

<script setup lang="ts">
import { useRoute } from "vue-router";
import {ref, watch} from "vue";
const route = useRoute();
// 当前版本
const thisVersion = ref(0);
// 监听参数变化,更新版本,刷新组件(大致写法,未测试)
watch(() => route.params.message, () => {
  thisVersion.value ++;
})
</script>

2、查询参数

路由配置

const routes: RouteRecordRaw[] = [
  {
    path: '/',
    name: 'Hello',
    component: Hello,
  },
  {
      path: '/next-page',
      name: 'NextPage',
      component: NextPage,
  },
];

当前组件:传参

<template>
  <button @click="toNextPage">toNextPage</button>
</template>

<script setup lang="ts">
import {useRouter} from 'vue-router';
// 得到 router 对象
const router = useRouter();
// 页面跳转
const toNextPage = () => {
  router.push({name: 'NextPage', query: {message: "基本字符串", name: "訾博"}});
}
</script>

跳转目标组件:接收参数

<template>
  <h1>NextPage</h1>
  <h1>基本数据:{{ route.query.message }}</h1>
  <h1>基本数据:{{ route.query.name }}</h1>
</template>

<script setup lang="ts">
import { useRoute } from "vue-router";
const route = useRoute();
</script>

运行结果

image-20230415165257246

九、导航守卫

1、全局前置守卫

使用场景:做登录判断,未登陆用户跳转到登录页

修改router/index.ts

import { createRouter, createWebHistory } from 'vue-router';
import routes from './routes';

const router = createRouter({
  history: createWebHistory(),
  routes,
});

router.beforeEach((to, from) => {
  if (to.path === '/login') {
    // 在登录页做清除操作,如清除token等
  }

  if (!localStorage.getItem('token') && to.path !== '/login') {
    // 未登陆且访问的不是登录页,重定向到登录页面
    return '/login';
  }
});

export default router;

2、路由独享守卫

使用场景:部分页面不需要登录,部分页面需要登录才能访问

修改 router/routes.ts

// 权限校验
const auth = () => {
  if (!localStorage.getItem('token')) {
    // 未登陆,重定向到登录页面
    return '/login';
  }
};

// 路由配置
const routes = [
  {
    path: '/',
    component: () => import('@/pages/login.vue'),
  },
  {
    path: '/home',
    component: () => import('@/pages/home.vue'),
    beforeEnter: auth,
  },
];

export default routes;

3、组件内守卫

使用场景:预防用户在还未保存修改前突然离开。该导航可以通过返回 false 来取消

<script setup lang="ts">
import { onBeforeRouteLeave } from 'vue-router';

// 与 beforeRouteLeave 相同,无法访问 `this`
onBeforeRouteLeave((to, from) => {
  const answer = window.confirm('确定离开吗');
  // 不再跳转
  if (!answer) return false;
});
</script>

十、路由元信息

将自定义信息附加到路由上,例如页面标题,是否需要权限,是否开启页面缓存等

使用情景:使用路由元信息+全局前置守卫实现部分页面不需要登录,部分页面需要登录才能访问

修改router/routes.ts

const routes = [
  {
    path: "/home",
    component: () => import("@/pages/home.vue"),
    redirect: "/home/user",
    children: [
      {
        path: "/home/user",
        component: () => import("@/pages/user.vue"),
      },
      {
        path: "/home/manage",
        component: () => import("@/pages/manage.vue"),
        meta: {
          title: "管理页", // 页面标题
          auth: true, // 需要登录权限
        },
      },
    ],
  },
];

修改 router/index.ts

router.beforeEach((to, from) => {
  if (!localStorage.getItem("token") && to.meta.auth) {
    // 此路由需要授权,请检查是否已登录
    // 如果没有,则重定向到登录页面
    return {
      path: "/login",
      // 保存我们所在的位置,以便以后再来 (因为跳转到登录页面,用户登录之后还需跳转回来)
      query: { redirect: to.fullPath },
    };
  }
});

十一、router-link

router-link 组件默认为a标签,在vue router 3.x中,可通过tag属性更改标签名,event属性更改事件名

在vue router 4.x中,这两个属性已被删除,通过作用域插槽(子组件给父组件传值的插槽)实现自定义导航标签

示例:将导航标签改为div,且需双击触发

<router-link v-slot="{ href, navigate, isExactActive }" to="/home/user" custom>
  <div :class="{ active: isExactActive }" :href="href" @dblclick="navigate">跳转user</div>
</router-link>

十二、动态路由

与动态路由匹配不同,动态路由是手动添加路由表中没有的路由,通常用在权限校验中,如果没有该权限,直接访问该路由失败

1、修改 router/routes.ts

const routes = [
  {
    path: "/login",
    component: () => import("@/pages/login.vue"),
  },
  {
    path: "/register/:plan",
    component: () => import("@/pages/register.vue"),
  },
  {
    path: "/home",
    name: "Home", // 增加 name,动态路由通过 name 挂载到该子路由下
    component: () => import("@/pages/home.vue"),
    redirect: "/home/user",
    children: [
      {
        path: "/home/user",
        component: () => import("@/pages/user.vue"),
      },
    ],
  },
  {
    path: "/:pathMatch(.*)*",
    component: () => import("@/pages/notFound.vue"),
  },
];

// 将 /home/manage 拆出来
export const manageRoute = {
  path: "/home/manage",
  component: () => import("@/pages/manage.vue"),
};

export default routes;

2、修改 pages/login.vue

<script setup lang="ts">
  localStorage.setItem('role', 'admin'); //在登录页存储用户等级
</script>;

3、修改 App.vue

如果 localStorage.getItem(‘role’) 的值不为 admin ,直接访问 /home/manage,会返回 404 页面

<script setup lang="ts">
import { watch } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { manageRoute } from '@/router/routes';

const router = useRouter();
const route = useRoute();
watch(route, async (newVal) => {
  const role = localStorage.getItem('role');
  if (role && role === 'admin') {
    // admin 直接访问
    router.addRoute('Home', manageRoute);
    // 防止页面刷新,路由丢失
    if (newVal.fullPath === '/home/manage') {
      // 会返回404页面
      await router.replace('/home/manage');
    }
  }
});
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联合索引该如何选择合适的列?

前面一篇文章&#xff0c;松哥和大家聊了 MySQL 中的索引合并&#xff0c;虽然 MySQL 提供了索引合并机制来提升 SQL 执行的效率&#xff0c;然而在具体实践中&#xff0c;如果能避免发生索引合并是最好的&#xff0c;毕竟这是没办法的办法&#xff0c;是一个下下策。发生索引合…

Wikidata 模型分析+实体抽取+数据处理

Wikidata 数据分析与处理 需求&#xff1a;Wikidata 数据描述了很多实体&#xff0c;以及实体属性。比如某一个公司/组织/机构名称是&#xff1a;阿里巴巴&#xff0c;对数据内该组织的相关属性进行观察、分析、治理、抽取等&#xff0c;最后用图数据库进行存储和展示其关系&am…

为什么半导体FAB生产线需要EAP系统?

在半导体制造中&#xff0c;设备自动化系统EAP&#xff08;Equipment Automation Program&#xff09;是不可或缺的重要软件&#xff0c;它是连接MES、RMS、APC、FDC等上层系统和设备层的桥梁&#xff0c;用于管控生产线上的所有机台&#xff0c;并实现设备运行的自动化。 作为…

QT+OpenGL高级数据和高级GLSL

QTOpenGL高级数据和高级GLSL 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 高级数据 OpenGL中的缓冲区 对象管理特定的GPU内存 在将缓冲区绑定到特定的缓冲区目标时候赋予它意义 OpenGL在内部会保…

项目环境配置、不知晓问题自己搜索后得到的解答

目录 Anolis OS龙蜥操作系统 Kernel Selection 4.18.0(RHCK) Compatible with RHEL (kernel-4.18.0) 4.19.91(ANCK) Support Anolis OS verified platform (kernel-4.19.91) 这两个内核选择哪个比较好呢&#xff1f; 我的C盘有些满&#xff0c;我该如何删除一些我需要的东西…

docker网络访问和端口映射

docker网络访问和端口映射 文章目录 docker网络访问和端口映射1.docker容器网络1.1.创建一个centos7的容器1.2.docker网络原理图 2.端口映射2.1.创建一个新的IP2.2.多个IP端口映射2.3.随机端口命令 1.docker容器网络 指定映射&#xff08;docker 会 自动添加一条iptables规则来…

wisp5.0 学习日记2

学习日记 昨天的报错尝试1&#xff0c;在CCS中设置USB FET尝试2 csdn解决方案1尝试3 查看仿真器的驱动是否安装成功 昨天的报错 MSP430: Error initializing emulator: No USB FET was found 尝试1&#xff0c;在CCS中设置USB FET 打开CCS&#xff0c;选择“Window” -> …

在线文档编辑工具哪个更好?

在线文档编辑工具相当于一个轻量级、跨平台、多途径的Office。使用在线文档编辑工具&#xff0c;首先我们不用安装Office软件&#xff1b;其次在电脑网页上、手机小程序里我们都可以使用在线文档进行简单的编辑&#xff1b;最后我们编辑的文档可以实时更新、分享、协作等。今天…

供应商标准化管理难?云时通助力国药器械成功打造医疗器械行业SRM管理平台!

中国医疗器械有限公司(CMDC,简称“国药器械”)&#xff0c;始建于1966年&#xff0c;隶属于国药集团&#xff0c;是其医疗器械板块的主力军。国药器械有分子公司300家左右&#xff0c;年销售额300多亿&#xff0c;国内最大的医疗器械商业流通企业&#xff0c;产品覆盖医疗器械所…

软件测试简历?面试题?企业面试官想要什么?我不再和offer失之交臂...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试面试题简历…

vivado跨时钟域路径分析

若要查看跨时钟域路径分析报告&#xff0c;可选择以下内容之一来查看&#xff1a; A, Reports > Timing > Report Clock Interaction B, Flow Navigator > Synthesis > Report Clock Interaction C, Flow Navigator > Implementation > Report Clock Inte…

【网络安全】--win提权

win提权 提权目的提权常用命令提权实战常见的payload利用1. 安装虚拟机win2008和kali2. 创建普通用户3. 切换用户4. kali生成木马并发送到被攻击服务器上5. 被攻击方运行生成的木马文件7. 查看可利用漏洞8. 尝试利用exp提权 at/sc/ps命令提权at命令提权sc命令提权ps命令提权 提…

换个花样玩C++(8)吃不透内存布局,坑的是自己,万字经验告诉你类的内存布局

C++内存布局是老生常谈的话题,无论是笔试面试,都会涉及到该类问题,那么这一章节,我们就聊聊内存布局到底是怎么布局的,聊完之后我保证你仍然会回味无穷,并且我提供的几个例子也会让你再一步步踩入雷区。 C++程序的内存布局 C++的内存布局区域我们大体上分为四个:全局数据…

SubMain CodeIt.Right 2022.2 Crack

CodeIt.Right&#xff0c;从源头上提高产品质量&#xff0c;在编写代码时获取有关问题的实时反馈&#xff0c;支持最佳实践和合规性&#xff0c;自动执行代码审查&#xff0c;轻松避免与您的群组无关的通知&#xff0c;一目了然地了解代码库的运行状况 自动执行代码审查 使用自…

ICMP协议和NAT技术

文章目录 ICMP协议ICMP功能NAT技术NAT技术背景 ICMP协议 ICMP协议是一个网络层协议 一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因 ICMP功能 ICMP正是提…

K8s常见面试题19问

K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题. 如果有新的面试题私聊或者留言给我 1. Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机&#xff0c;在虚拟化硬件之上运行所有组件&#xff0c;包括其自己的操作系统。 容器之间可以共…

什么叫用空间换时间,用时间换空间

什么叫做用空间换时间 用空间换时间是指为了提高程序或算法的效率&#xff0c;将计算机程序中的时间复杂度转化为空间复杂度&#xff0c;即通过使用更多的空间来减少程序运行所需的时间。这种技术在某些情况下可以大幅缩短程序的执行时间&#xff0c;但也会导致程序需要更大的…

【软件开发】大规模分布式系统的容错架构设计

大规模分布式系统的容错架构设计 假设有一个数据库&#xff0c;数据库里有一张特别大的表&#xff0c;里面有几十亿&#xff0c;甚至上百亿的数据。更进一步说&#xff0c;假设这一张表的数据量多达几十个 TB&#xff0c;甚至上百个 TB&#xff0c;那么如果用 MySQL 之类的数据…

功率信号源的作用是什么意思

功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器&#xff0c;它具有高电压、大功率的特点&#xff0c;在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等&#xff0c;可以有效的帮助电子工程师解决驱动负载和放大功率的问题。同时&#xff0c;功率信…

使用python实现背单词功能,单词本存放在txt文件中,最后统计出回答的正确题数和错误题数。

一、编程题目 编程题目&#xff1a;使用python实现背单词功能&#xff0c;单词本存放在txt文件中&#xff0c;最后统计出回答的正确题数和错误题数。 单词本的内容如下&#xff1a; danciben.txt内容如下&#xff08;按照格式&#xff0c;可自行定义单词本的内容&#xff09;&a…