【Vue3 生态】Vue Router 路由知识概览

news2024/11/28 23:52:32

前言

在 Web 前端开发中,路由是非常重要的一环,但是路由到底是什么呢?

  • 从路由的用途上讲

    路由是指随着浏览器地址栏的变化,展示给用户不同的页面。

  • 从路由的实现原理上讲

    路由是URL到函数的映射。它将 URL 和应用程序的不同部分映射到特定的处理程序或控制器上。

路由本身也经历了不同的发展阶段:

  1. 服务端路由

    服务端路由也称后端路由。

    服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服务端获得全新的 HTML,然后重新加载整个页面。

    对于最简单的静态资源服务器,可以认为所有URL的映射函数就是一个文件读取操作。对于动态资源,映射函数可能是一个数据库读取操作,也可能是进行一些数据处理等等。

    • 好处

      安全性好、利于 SEO(Search Engine Optimization,搜索引擎优化。是指为了增加网页在搜索引擎自然搜索结果中的收录数量以及提升排序位置而做的优化行为)

    • 缺点

      加大服务器的压力,不利于用户体验,代码冗余

    正式服务端路由得缺点,让客户端路由开始展露头角。

  2. 客户端路由

    客户端路由也称前端路由。

    当用户通过客户端访问不同的路径时,路由的映射函数利用诸如 History API 或是 hashchange 事件这样的浏览器 API 来管理应用当前应该渲染的视图,其根本就是操作 DOM 的显示和隐藏。

    • 基于 hash 的实现

      早期的前端路由的实现就是基于location.hash来实现的。实现原理也很简单就是:监听#后面的内容来发起Ajax请求来进行局部更新,而不需要刷新整个页面。

      location.hash的值就是URL中#后面的内容。

      例如:https://www.happy.com#me中的 location.hash = ‘#me’

      hash也存在下面几个特性:

      1.URL中的hash值只是客户端的一种状态,也就是说当向服务器发出请求时,hash部分不会被发送。

      2.hash值的改变,都会在浏览器的访问历史中增加一个记录,因此我们能通过浏览器的回退,前进按钮控制hash 的切换。

      3.我们可以使用hashchange事件来监听URL的变化

      触发hash变化的方式也有两种:

      1.通过a标签,并设置href属性,当用户点击这个标签后,URL就会发生变化,也就会触发hashchange事件了
      
         例如:<a href="#hahha">hahha</a>
      
      2.直接使用js来对location.hash进行赋值,从而改变URL 触发hashchange事件
      
         例如: location.hash = '#hahha'
      
      3.浏览器前进后退改变 URL,触发hashchange事件
      
    • 基于 history API 的实现

      1. 切换历史状态

        包括 back() 、forword() 、go(n) 三个方法,分别对应浏览器的前进,后退,跳转操作

        history.go(-2) //后退两次 + 刷新
        history.go(2) //前进两次
        history.back() //后退 (不刷新)
        history.forword() //前进
        

        back() 方法可加载历史列表中的前一个 URL(如果存在)。调用该方法的效果等价于点击后退按钮或调用 history.go(-1)

        forward() 方法可加载历史列表中的下一个 URL。调用该方法的效果等价于点击前进按钮或调用 history.go(1)

      2. 修改历史状态

        包括 pushState() 、replaceState() 两个方法,都接收三个参数:stateObj 、title、url。它们可以在不刷新页面的情况下,操作浏览器的历史记录。

        • pushState() 新增一个历史记录
        • replaceState() 替换当前的历史记录
        • popstate() 事件。用于监听历史记录的变化

        参数:

        • 状态对象(state object):一个JavaScript对象,与用 pushState() 方法创建的新历史记录条目关联。无论何时用户导航到新创建的状态,会触发popstate 事件,并能在事件中使用该对象
        • 标题(title):一般浏览器会忽略,传 null 即可
        • 地址(URL):需要新增的历史记录地址,浏览器不会去直接加载改地址,但后面也可能会去尝试加载该地址。此外需要注意的是,传入的URL与当前URL应该是同源的。
      window.onpopstate = function(event) {
        alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
      };
      
      history.pushState({page: 1}, "title 1", "?page=1");
      history.pushState({page: 2}, "title 2", "?page=2");
      history.replaceState({page: 3}, "title 3", "?page=3");
      history.back(); // 弹出 "location: http://example.com/example.html?page=1, state: {"page":1}"
      history.back(); // 弹出 "location: http://example.com/example.html, state: null
      history.go(2);  // 弹出 "location: http://example.com/example.html?page=3, state: {"page":3}
      

**总结:**无论是客户端路由还是服务端路由,都有一定的应用场景和适用范围。对于需要提供优秀用户体验和动态交互的 Web 应用,客户端路由更为适用;而对于需要提供更好的SEO优化和网站性能的网站,服务端路由更为适用。但之后的出现了nuxt.jsnext.js,很大程度上弥补了传统的客户端路由不利于SEO优化的问题。

一、Vue 中的路由

Vue 属于单页面应用,而单页面应用中“路由”是在客户端执行的。客户端的 JavaScript 可以拦截页面的跳转请求,动态获取新的数据,然后在无需重新加载的情况下更新当前页面。这样通常可以带来更顺滑的用户体验,尤其是在更偏向“应用”的场景下,因为这类场景下用户通常会在很长的一段时间中做出多次交互。

如果你只需要一个简单的页面路由,而不想为此引入一整个路由库,你可以通过动态组件的方式,监听浏览器 hashchange 事件或使用 History API 来更新当前组件。

<script setup>
import { ref, computed } from 'vue'
import A from './A.vue'
import B from './B.vue'
import NotFound from "./NotFound.vue"

const routes = {
    '/': A,
    '/b': B
}

const currentPath = ref(window.location.hash)
window.addEventListener('hashchange', () => {
    currentPath.value = window.location.hash
})
const currentView = computed(() => {
    return routes[currentPath.value.slice(1) || '/'] || NotFound
})
</script>
<template>
    <div>
        <div>
            <a href="#/">A</a>
            <a href="#/b" style="margin-left: 20px">B</a>
        </div>
        <br>
        <Transition name="fade">
            <component :is="currentView" style="margin-top:50px" tag="div"></component>
        </Transition>
    </div>
</template>
<style scoped lang="less">
.fade-enter-from {
    opacity: 0;
}

.fade-enter-active {
    transition: opacity 1s 0.5s ease;
}

.fade-leave-to {
    opacity: 0;
}

.fade-leave-active {
    transition: opacity .5s ease;
}
</style>

如果是做项目的话,路由库就是必须的了。针对 Vue 项目,官方也推出自己的路由库 Vue Router,为 Vue.js 提供富有表现力、可配置的、方便的路由。

二、Vue Router

在这里插入图片描述

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。功能包括:

  • 嵌套路由映射
  • 动态路由选择
  • 模块化、基于组件的路由配置
  • 路由参数、查询、通配符
  • 展示由 Vue.js 的过渡系统提供的过渡效果
  • 细致的导航控制
  • 自动激活 CSS 类的链接
  • HTML5 history 模式或 hash 模式
  • 可定制的滚动行为
  • URL 的正确编码

2.1 安装与使用

2.2.1 安装

CDN下载地址:https://unpkg.com/vue-router@4.2.2/dist/vue-router.global.js

项目集成,安装 vue-router

# yarn 方式
yarn add vue-router@4

# npm 方式
npm install vue-router@4

安装成功后的 package.json

在这里插入图片描述

2.2.2 组件映射到路由

安装好 Vue Router 之后,我们需要做的就是将组件映射到路由上,让它知道应该在哪里渲染这些组件。

  1. 编写映射代码(目录及文件如果没有,请创建)

    # src/router/index.js
    
    // 引入路由相关方法
    import { createRouter, createWebHistory } from 'vue-router'
    // 引入登录组件 Login
    import Login from '../views/Login.vue'
    // 定义一些路由:每个路由都需要映射到一个组件。路由过多时,根据情况可以分离到单独的文件中
    const routes = [
    	{ path:'/', redirect: '/login' }, // redirect 重定向。这里访问根目录时,跳转到登录页
    	{ path: '/login', name: 'login', component: Login, meta: { title: '登录' } }, // meta 定义路由页的元信息
    	{ 
    		path: '/home',
    		name: 'home',
    		component: () => import('../views/Home.vue'),// 这里组件采用惰性加载,打包时从路由层面拆分代码,可生成一个单独的块 Home.[hash].js
    		children: [ // 嵌套路由:定义子路由信息
    			{
    				name: 'welcome',
                    path: "/welcome",
                    component: () => import ('../views/Welcome.vue'),
                    meta: { title: "欢迎页" }
                },
                {
                    name: 'user',
                    path: "/user",
                    component: () => import ('../views/BaseData/User.vue'),
                    meta: { title: "用户管理" }
                }
    		]
        } 
    ]
    // 创建路由实例并传递 routes 配置
    const router = createRouter({ // 函数参数:路由配置项
    	// 默认提供 history 模式实现。可通过引入 createWebHashHistory 配置 hash 模式。
    	history: createWebHistory(import.meta.env.BASE_URL),
    	// history: createWebHashHistory()
    	// 配置路由
    	routes
    })
    // 导出路由实例
    export default router
    
  2. 将路由配置文件挂载到 Vue 应用上

    # src/main.js
    
    import { createApp } from 'vue'
    import App from './App.vue'
    import router from './router' // 默认查找当前路径下的 index.js,同 './router/index'
    
    const app = createApp(App)
    app.use(router)
    app.mount('#app')
    
  3. 在组件中使用路由

    组件中使用路由,涉及到**“路由跳转”“路由出口”**两个概念:

    • router-link

      自定义组件,用于创建链接。可以使 Vue Router 在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。

    • router-view

      路由出口,用于显示与 url 对应的组件(路由映射组件),可以放到任何位置。

    <div id="app">
      <h1>Hello App!</h1>
      <p>
        <!--使用 router-link 组件进行导航 -->
        <!--通过传递 `to` 来指定链接 -->
        <!--`<router-link>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签-->
        <router-link to="/">Go to Home</router-link>
        <router-link to="/about">Go to About</router-link>
      </p>
      <!-- 路由出口 -->
      <!-- 路由匹配到的组件将渲染在这里 -->
      <router-view></router-view>
    </div>
    

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

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

相关文章

低代码平台——提高研发效率的神器

一、前言 听起来像是一个噱头&#xff0c;但是低代码确实是一个能够快速提高研发效率的神器。 通过使用低代码平台&#xff0c;研发人员可以节省好几个月的时间&#xff0c;将前后端各种功能可视化以搭积木的形式快速完成。今天&#xff0c;我们将深入探讨低代码开发平台的特点…

两阶段目标检测指南:R-CNN、FPN、Mask R-CNN

动动发财的小手&#xff0c;点个赞吧&#xff01; Source[1] 多阶段&#xff08;Two-stage&#xff09;物体检测 计算机视觉中最基本和最广泛研究的挑战之一是目标检测。该任务旨在在给定图像中绘制多个对象边界框&#xff0c;这在包括自动驾驶在内的许多领域非常重要。通常&am…

一种看门狗复位电源的电路

如下是一个看门狗复位电源的电路&#xff1a; 满足掉电能被监测到&#xff0c;掉电后利用法拉电容保持后级模组继续工作一段时间。 看门狗可以关闭电源 320ms 20ms &#xff0c;对后级模组起到断电复位作用。 同时复位电源拉低的是VCC_4V 而非超级电容所在的VCC_4V_IN,并不会…

SpringBoot项目的事务实现

说明&#xff1a;当业务中的某个功能&#xff0c;需要多个操作组合执行才能完成时&#xff08;如删除部门&#xff0c;部门下的员工也需要同步删除时&#xff09;&#xff0c;为了保证数据的一致性&#xff0c;需要对这些组合操作添加事务。&#xff08;参考&#xff1a;http:/…

从电源 LED 读取智能手机的秘密?

研究人员设计了一种新的攻击方法&#xff0c;通过记录读卡器或智能手机打开时的电源 LED&#xff0c;使用 iPhone 摄像头或商业监控系统恢复存储在智能卡和智能手机中的加密密钥。 众所周知&#xff0c;这是一种侧信道攻击。 通过密切监视功耗、声音、电磁辐射或执行操作所需…

一、elasticsearch的简介与安装

目录 一、Elasticsearch下载 二、安装 三、启动 四、安装可视化插件&#xff08;elasticsearch-head&#xff09; 1、下载地址 2、解压缩下载好的压缩文件 3、进入解压缩目录 五、解决跨域问题 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方…

端午节出行的小贴士——行之安,乐之逍

亲爱的朋友们&#xff0c; 随着端午节的到来&#xff0c;想必许多人已经开始期待那份出游的快乐与解脱。无论你是期待漫步在宁静的田野小径&#xff0c;还是在繁华的城市中探索&#xff0c;这篇文章都会给你一些实用的端午节出行建议&#xff0c;帮助你尽情享受旅程。 首先&a…

Airtest图像识别测试工具原理解读最佳实践 | 京东云技术团队

1 Airtest简介 Airtest是一个跨平台的、基于图像识别的UI自动化测试框架&#xff0c;适用于游戏和App&#xff0c;支持平台有Windows、Android和iOS。Airtest框架基于一种图形脚本语言Sikuli&#xff0c;引用该框架后&#xff0c;不再需要一行行的写代码&#xff0c;通过截取按…

如何利用数据化营销助力新零售企业发展?”

​“新零售”这个概念诞生至今已有5年&#xff0c;但对于其具体的定义&#xff0c;行业内仍然有许多争议。有人认为“新零售”是对传统零售模式的颠覆&#xff1b;也有人认为“新零售”就是将线上和线下相结合。不论如何&#xff0c;在这个不断变化的行业中&#xff0c;新零售企…

使用omp技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

智能数字资产管理系统,全面提升企业的管理效率

智能数字资产管理系统&#xff0c;能够为企业带来很多成果&#xff0c;提高企业管理效率。让程序简单化&#xff0c;提升组织生产率&#xff0c;可以帮助企业以更有效的方式企业实现目标。 研发背景 智能数字资产管理系统 系统功能 1.可以实现数字资产全生命周期的管理&#…

大厂月薪15K被优化,面试 “吹牛” 入职小厂,月薪25K 好慌...

某大厂员工被优化&#xff0c;面试“吹牛”入职小厂&#xff0c;纠结去不去&#xff0c;心里有点慌。 作为一个从福报厂出来的HR&#xff0c;目前在100多人的小厂当HR总监。面对这种情况已经是见怪不怪了。作为小厂&#xff0c;没有大厂那么严格的背调&#xff0c;所以有些来自…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用&#xff0c;就是让Internet上的其他用户&#xff0c;可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后&#xff0c;在Internet下的其它电脑、手机等网络设备&#xff0c;将无法自接访问你电脑…

C++ 反汇编简要

摘要&#xff1a;本文主要描述x86_64机器中C代码在汇编中的具体代码。   关键字&#xff1a;cpp,IA32,asm   注意&#xff1a;本书假定你拥有基本的C软件开发能力&#xff0c;能够理解基本的C代码。并且熟悉汇编代码&#xff0c;了解基本的取址模式并且熟悉IA32指令集&…

基于LDA与PCA算法的鸢尾花数据集二维投影比较

目录 1. 作者介绍2. LDA和PCA算法介绍2.1 LDA算法2.2 PCA算法2.3 两个算法的区别与联系 3. 实验过程3.1 数据集介绍3.2 算法流程3.3 核心算法介绍3.4 完整代码3.5 实验结果与分析 1. 作者介绍 王鑫&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生…

70+页实战经验分享,《研发效能红宝书》重磅发布 | 附下载

研发效能提升方法从来没有标准答案&#xff0c;不同角色的人&#xff0c;以不同的目标搭建效能体系的方法千差万别&#xff0c;但又存在互通之处。所以做研发效能更需要多方借鉴&#xff0c;然后因地制宜&#xff0c;找到适合自己的方式。于是&#xff0c;我们汇集业界多位效能…

shell脚本解析 01

一、shell 概述 1.shell 的两层含义&#xff1a; 既是一种应用程序,又是一种程序设计语言 a.作为应用程序&#xff1a; 交互式地解释、执行用户输入的命令&#xff0c;将用户的操作翻译成机器可以识别的语言&#xff0c;完成相应功能。称之为 shell 命令解析器。shell 是用户和…

DreamBooth论文解读

文章目录 摘要问题算法3.1 文生图扩散模型3.2 个性化文生图模型3.3 特定类别先验保留损失 实验评估方式比较消融实验PPL类别先验 应用限制 结论 论文&#xff1a; 《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》 project&#xf…

yueyin uart ip 使用说明文档

目录 1 概述2 IP功能3 IP端口4 收发数据时序4.1 Uart_tx接口4.2 Uart_rx接口5 获取IP地址 1 概述 本文用于讲解yueyin IP 的uart ip&#xff08;串口/rs422/rs485/rs232&#xff09;的功能&#xff0c;以及使用说明&#xff0c;方便使用者快速上手。 版本&#xff1a;V1.0.0 编…

行业报告 | 清华大学AIGC发展研究1.0震撼发布!(技术+未来篇)

文 | BFT机器人 01 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤&#xff1a; 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键步骤…