Vue Router4

news2024/11/25 4:36:13

后端路由

  1. 客户端请求不同的URL
  2. 服务器匹配URL并给一个Controller处理
  3. Controller处理完返回渲染好的HTML页面或数据给前端

优点:
不需要单独加载js和css,直角交给浏览器展示,有利于SEO优化

缺点:
页面有后端人员编写或由前端人员使用PHP/Java编写

前端路由

  1. 前后端分离:后端提供API,前端渲染数据到页面上
  2. SPA(单页面富应用):前后端分离+前端路由
  3. 前端路由核心:URL和组件相互映射。改变URL,页面不整体刷新

改变URL 页面不刷新的两种模式

  1. URL的hash(锚点#),H5的API location
<template>
  <div>
    <a href="#/home">首页/</a>
    <a href="#/about">关于/</a>
    <div class="router-view" ref="divRef"></div>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'

// 获取DOM
let divRef = ref()

// DOM挂载完成
onMounted(() => {

  // 监听hash值的改变(相当与监听URL的改变)
  window.addEventListener('hashchange', () => {
    switch (location.hash) {
      case "#/home":
        divRef.value.innerHTML = "home"
        break;
      case "#/about":
        divRef.value.innerHTML = "about"
        break;
      default:
        divRef.value.innerHTML = "default"
        break;
    }
  })
})

</script>
  1. H5新增API的history
    history实例方法,改变URL而不刷新页面:
    back()
    forward()
    go()
    pushState()
    replaceState()

基本使用

路由映射文件

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '@/views/HomeView.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('@/views/AboutView.vue')
    }
  ]
})

export default router

App.vue

<template>
  <div>
    <!-- 字符串形式 -->
    <router-link to="/">首页</router-link>
    <router-link to="/about">关于</router-link>
    <!-- 对象形式 -->
    <router-link :to="{ path: '/about' }">关于</router-link>

    <!-- 路由出口 -->
    <router-view></router-view>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'

</script>

<style scoped>
/* 高亮 */
.router-link-active {
  color: red;
  font-size: 20px;
}
</style>

动态路由(路径参数)

params参数

动态路由:根据匹配模式,不同路径的路由映射到同一个组件

匹配模式匹配路径$route.params
/users/:username/users/eduardo{ username: 'eduardo' }
/users/:username/posts/:postId/users/eduardo/posts/123{ username: 'eduardo', postId: '123' }

匹配模式

{
	path: '/user/:id',
	name: 'user',
	component: () => import('@/views/UserView.vue')
}

App.vue传递参数

<template>
  <div>
    <router-link to="/">首页</router-link>
    <router-link to="/about">关于</router-link>
    <!-- 给路由传参 -->
    <router-link :to="{ path: `/user/${id}` }">用户{{ id }}</router-link>
    <router-link to="/user/2">用户2</router-link>

    <!-- 路由出口 -->
    <router-view></router-view>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'
let id = ref(100)
</script>

<style scoped>
/* 高亮 */
.router-link-active {
  color: red;
  font-size: 20px;
}
</style>

UserView.vue接收参数

<template>
  <div>
    <!-- 
      UserView接收到params参数,根据不同id进行不同操作
     -->
    <h1>user-{{ $route.params.id }}</h1>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue'
import { useRoute } from 'vue-router';

const route = useRoute()
console.log(route.params);

</script>

在这里插入图片描述
在这里插入图片描述

query参数

App.vue传递query参数

const router = useRouter()
function handleClick() {
  router.push({
    path: '/user/2',
    query: {
      name: 'cjc',
      age: 999
    }
  })
}
// http://127.0.0.1:5173/user/2?name=cjc&age=999

UserView.vue接收参数

<!-- query参数 -->
<h1>query-{{ $route.query }}</h1>
const route = useRoute()
console.log(route.query);

路由改变 组件复用

用户从 /user/1 导航到 /user/2 时,相同的组件实例UserView被重复使用。
因为组件没有销毁创建,故组件的生命周期钩子不会被调用

监听同一路由组件的路径参数的变化:

方式1 在UserView中使用watch

// 监听参数变化
watch(() => route.params, (toParams, previousParams) => {
  // 对路由变化做出响应
  console.log('toParams:', toParams);
  console.log('previousParams:', previousParams);
})

方式2 在UserView中使用onBeforeRouteUpdate

onBeforeRouteUpdate((to, from) => {
  console.log('to:', to.params);
  console.log('from:', from.params);
})

404

{
 //path: '/:pathMatch(.*)' 匹配内容以/形式
 //path: '/:pathMatch(.*)*' 匹配内容以数组形式
 path: '/:pathMatch(.*)*',
 name: 'NotFound',
 component: () => import('@/views/NotFound.vue')
}

将匹配所有内容并将其放在 $route.params.pathMatch

编程式路由导航

$router相关API

  • go
  • forward
  • back
  • push
  • replace

动态添加路由

router/index.js

...
// 动态添加路由
// 添加一级路由
router.addRoute({
  path: '/test',
  name: 'test',
  component: () => import("@/views/TestView.vue")
})

// 添加二级路由
router.addRoute("test", {
  path: '/testChild',
  name: 'testChild',
  component: () => import("@/views/TestChildView.vue")
})

// 检查路由是否存在
console.log(router.hasRoute('test'));

// 路由器router中所有路由
console.log(router.getRoutes());

// 删除路由
router.removeRoute('test')
console.log(router.getRoutes());

路由导航守卫

全局前置守卫beforeEach

参数

  • to “到哪去”的路由对象
  • from “从哪来”的路由对象

返回值

  • return false 取消当前导航
  • return;或return undefined;都是默认导航。等同于return to.path;
  • return 路由地址(string|对象(包含path,query,params))

登录导航守卫

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

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

相关文章

告别里程焦虑:深蓝S7超级增程打造超长续航

提起新能源汽车&#xff0c;估计许多人第一时间都会想要查看它的续航里程。 虽然如今的新能源汽车在续航里程上较过去已经有了很大改进&#xff0c;但是稀缺的充电桩和漫长的充电时间&#xff0c;仍然无法让需要长途出行的用户摆脱里程焦虑。 那么问题就来了&#xff1a;有没有…

基于协同过滤算法的外贸出口电子电器产品的推荐系统的设计与实现源码+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于协同过滤算法的外贸出口电子电器产品的推荐系统的设计与实现源码文档 视频演示 https://www.bilibili.com/video/BV1HW4y197Fe/ 系统介绍 摘 要 …

dubbo源码之-ExtensionInjector

dubbo源码之-ExtensionInjector 概述源码入口Extension 是如何获取到&#xff1f;SpiExtensionInjector 概述 其实ExtensionInjector 非常简单&#xff0c; 我们知道dubbo有ioc注入的功能&#xff0c; 是靠的set方法注入&#xff0c;对应的底层源码主要是ExtensionInjector 如…

MySQL数据库语言一、DDL

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

华为OD机试真题B卷 JavaScript 实现【分班】,附详细解题思路

一、题目描述 幼儿园两个班的小朋友在排队时混在了一起&#xff0c;每位小朋友都知道自己是否与前面一位小朋友是否同班&#xff0c;请你帮忙把同班的小朋友找出来。 小朋友的编号为整数&#xff0c;与前一位小朋友同班用Y表示&#xff0c;不同班用N表示。 二、输入描述 输…

uniapp/手机APP使用支付宝支付(服务端)

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

chatgpt赋能python:Python接口应用于SEO的指南

Python接口应用于SEO的指南 Python成为了web开发中最流行的语言之一&#xff0c;而且尤其在SEO领域中被广泛应用。一些Python库和框架可帮助SEO团队实现其目标&#xff0c;如排名跟踪&#xff0c;爬取数据&#xff0c;进行网站分析&#xff0c;等等。在本文中&#xff0c;我们…

基于Hexo和Butterfly创建个人技术博客,(9) 优化butterfly主题配置文章版本

Butterfly官方网站&#xff0c;请 点击进入 本章目标&#xff1a; 掌握butterfly主题对文章的配置&#xff0c;熟悉并可按需配置到个人的博客站点中&#xff0c;本章内容是一个必会章节&#xff0c;不仅包括文章的UI美化、SEO相关配置还包括其它增加的功能&#xff0c;内容不多…

英语不好能不能学编程?

入门教程、案例源码、学习资料、读者群 请访问&#xff1a; python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 常有人问我&#xff1a;我英语不好&#xff0c;想学编程行不行&#xff1f; 这个问题需要分情况讨论。 1. 可以学 如果你因为担心自己英语不…

chatgpt赋能python:Python怎么用?Python编程的入门指南

Python怎么用&#xff1f;Python编程的入门指南 Python是一种流行的高级编程语言&#xff0c;它被广泛应用于数据分析、机器学习、Web开发、自动化测试等领域。Python语言非常容易学习和使用&#xff0c;因此非常适合初学者和有经验的开发人员。在这篇文章中&#xff0c;我们将…

手把手教你在CentOS7.9上使用docker 安装MySQL5.7

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要讲解如何用docker在centos7.9系统上安装MySQL5.7&#xff0c;以及如何设置MySQL的远程登录。 文章收录到【容器管理】和【数据库入门到精通专栏】&#xff0c;此专栏是沐风晓月对linux云计算架构…

chatgpt赋能python:Python怎么清除动点轨迹?

Python怎么清除动点轨迹&#xff1f; 引言 在数据科学和可视化的领域中&#xff0c;动点轨迹是很有用的工具。动点轨迹可以轻松地显示数据点的时间序列&#xff0c;这可以帮助分析者发现有关数据集的有用信息。然而&#xff0c;当轨迹过于密集和复杂时&#xff0c;这种可视化…

Spring Cloud Alibaba - Sentinel源码分析(一)

目录 一、Sentinel核心源码分析 1、Sentinel核心概念 1.1、Node之间的关系 2、Sentinel源码入口 2.0、Sentinel源码启动 2.1、SlotChain解析 2.2、NodeSelectorSlot解析 2.3、ClusterBuilderSlot解析 2.4、StatisticSlot解析 2.5、FlowSlot解析 2.6、DegradeSlot解析…

白鲸优化算法优化VMD参数,最小包络熵为适应度函数,提取最小包络熵对应的IMF分量,采集最佳IMF分量的9种时域指标,提取特征向量。以西储大学数据为例,附MATLAB代码

大家看到这篇文章&#xff0c;肯定会有疑问&#xff0c;难道本篇文章和上一篇文章不是一个意思嘛&#xff0c;这是来凑数的嘛……其实不然&#xff0c;如果各位读者仔细看&#xff0c;就会发现本篇文章和上一篇文章大有不同&#xff0c;这篇文章也是我一直以来想在上一篇文章基…

chatgpt赋能python:Python断言:如何断言等于两个值其中一个?

Python断言&#xff1a;如何断言等于两个值其中一个&#xff1f; Python是一种广泛使用的编程语言&#xff0c;而断言是它的一个重要功能。在编程中&#xff0c;我们可以使用断言来验证代码是否按照预期工作。但是&#xff0c;在某些情况下&#xff0c;我们可能想要断言两个值…

快速上手kettle(四)壶中可以倒出些啥?

快速上手kettle&#xff08;四&#xff09;壶中可以倒出些啥 前言一 、kettle 这壶里能倒出啥&#xff1f;二 、Access输出2.1 Access输出设置2.2 启动转换&#xff0c;查看输出 三 、Excel输出3.1 选择excel扩展名3.2 1 将表中数据分别写入到excel中 四、JSON output4.1 JSON …

常见骨干网络介绍

骨干网络 骨干网络&#xff08;backbone network&#xff09;顾名思义&#xff0c;是深度学习中最核心的网络组成。本文按时间顺序&#xff0c;简要介绍几种影响重大的backbone设计思路&#xff0c;我们或许可以从窥探前人的设计思路中获得启发和灵感。 1.1 AlexNet, 2012 这…

10倍|中科院再传好消息:比英伟达还快,“新技术”实现弯道超车

中科院再传好消息&#xff1a;在光芯片上有了重大突破&#xff0c;李明-祝宁华团队研制出了一款超高集成度光学卷积处理器。 这种方案具有高算力密度、超高的线性扩展性&#xff01; 基于这种技术的&#xff0c;光芯片的性能将再次提升&#xff0c;光芯片是用于AI,如果能变成现…

每日算法(第二十四期)

先来回顾一下上期的问题及答案&#xff1a; 2023年6月15日 「电话号码的字母组合」&#xff08;Letter Combinations of a Phone Number&#xff09;。以下是题目的描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。给出数字到字母的…

记录--前端如何优雅导出多表头xlsx

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 xlsx导出是比较前后端开发过程中都比较常见的一个功能。但传统的二维表格可能很难能满足我们对业务的需求&#xff0c;因为当数据的维度和层次比较多时,二维表格很难以清晰和压缩的方式展现所有的…