前言

Vue.js 使用虚拟 DOM 处理单页面,然后使用 Webpack 打包。通过上一篇文章的例子,读者也许已经发现,无论语法和写法如何不同,Vue.js 程序打包后都是一个单一的 HTML 文件,同时会引入一个标准的 JavaScript 文件。

Vue.js 中编写的所有代码都被 Webpack 自动打包成可以被浏览器解析的 HTML 和 JavaScript 代码,并且项目本身就只有一个页面。这意味着所有的用户对服务器发出进入页面的请求时,只会对服务器发出一次请求。

传统的 HTML 网页应用如果进行页面跳转,会根据网页地址(URL)来刷新页面,在网速极大提高的今天,这类跳转仍会不可避免地出现“白屏”现象,这显然不是 Vue.js 单页面应用想要的效果。而应用本身又需要 URL 来控制页面,在这种情况下,Vue.js 提供了 vue-router 来实现页面跳转。

本文内容

本文只是对 vue-router 有个初步的了解,后续的文章中会有更深入的使用

  • vue-router 介绍
  • 两种路由模式以及实现原理
  • 编写三个简单的 vue 页面
  • vue-router 的安装与配置
  • 测试与验证

关于 vue-router

本项目使用的 vue-router 版本是 3.x,官方文档: https://v3.router.vuejs.org/zh/

Vue Router 是官方为 Vue.js 提供的路由管理器,它与 Vue.js 深度集成,让开发者能够轻松构建单页面应用。

通过 Vue Router,可以使用基于组件的方式定义路由,以实现灵活的页面结构和嵌套视图组织。

它的主要功能包括:

  • 灵活的路由定义:支持嵌套路由、通过 URL 参数与查询字符串传递数据,以及使用通配符实现动态匹配。
  • 简洁的组件化配置:将路由与组件有机结合,更好地组织项目结构。
  • 多种模式选择:在现代浏览器下可以使用历史模式,为用户带来更佳的 URL 体验;在不支持的环境中则自动降级为哈希模式。
  • 平滑的过渡动画:与 Vue 的过渡系统集成,可以轻松实现页面切换时的流畅过渡动画。
  • 细粒度的导航控制:通过导航守卫,你可以在路由切换前后进行权限检查、数据预加载等逻辑处理。
  • 个性化体验:包括可自定义的滚动行为,以及在活跃链接上自动添加 CSS 类,为用户提供更好的交互与界面反馈。

URL 模式

vue-router 有两种模式模拟 URL:hash 模式和 history 模式。(本项目使用默认的 hash 模式)

  • hash 模式是默认模式,使用网页的 URL 模拟一个完整的 URL,当 # 后的哈希值发生变化时,重新获取 hash 对应的页面(在 Vue.js 中是需要显示的组件),并将这些内容显示在页面中。
  • history 模式针对的是支持 HTML 5 新特性 history 的浏览器,其本身就是用户访问页面时浏览记录的堆栈,HTML 5 允许操作 history 栈中的内容。

PS:无论采用何种方式配置 vue-router,Vue.js 单页面应用都不会刷新页面。

实现方式的区别

  • hash 模式的实现是通过 history.pushState() 跳转路由;通过 hashchange event 监听路由变化。
  • history 模式通过 history.pushStatehistory.replaceState 改变 URL;通过 popstate event 监听路由变化,但无法监听到 history.pushState() 时的路由变化。

体验上的区别

  • hash 只能改变#后的值,而 history 模式可以随意设置同源 url;
  • hash 只能添加字符串类的数据,而 history 可以通过 API 添加多种类型的数据;
  • hash 无需后端配置且兼容性好,而 history 需要配置 index.html 用于匹配不到资源的情况;
  • hash 的历史记录只显示之前的 www.a.com 而不会显示 hash 值,而 history 的每条记录都会进入到历史记录 (在 Chrome102 版本之后,hash 模式的完整 URL 也会加入浏览器的历史记录了)

添加页面

先回顾一下我们的项目目录结构

starblog-admin-ui
├── build
├── config
├── node_modules
├── src
│ ├── assets
│ ├── router
│ ├── components
│ ├── App.vue
│ └── main.js
├── static
├── test
├── README.md
├── index.html
├── package.json
└── yarn.lock

现在我要把 src/components 这个目录改成 views

然后在里面分别添加三个页面

  • Login.vue
  • Home.vue
  • 404.vue

主页面

Home.vue 代码

<template>
<el-alert
title="主页"
type="success">
</el-alert>
</template> <script>
export default {
name: "Home"
}
</script> <style scoped> </style>

登录页面

然后是 Login.vue

<template>
<el-alert
title="登录"
type="info">
</el-alert>
</template>

404 页面

还有 404.vue

<template>
<el-alert
title="未找到"
type="error">
</el-alert>
</template>

这时控制台应该会报错了,不过问题不大,先来配置路由

安装和配置

之前我们在使用 vue-cli 创建项目的时候选择了使用 vue-router,所以不需要安装了。

如果没有的话,需要手动安装进去(本项目使用的 vue-router 版本是 3.x,现在最新版已经是 4.x 了,安装的时候请注意选择对应的版本)

yarn add vue-router

然后在 src 目录下新建一个 router 目录,里面再新建个 index.js,代码如下

import Vue from 'vue'
import Router from 'vue-router'
import Login from "@/views/Login";
import Home from "@/views/Home";
import NotFound from '@/views/404' Vue.use(Router) export default new Router({
mode: 'history', // 这里可以设置模拟URL的模式
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/Login',
name: 'Login',
component: Login
},
{
path: '/404',
name: 'NotFound',
component: NotFound
},
]
})

这里面有个 mode 设置,就是前面提到的两种模式模拟 URL,如果设置了 history,这样跳转页面的时候,浏览器的地址栏里面就是这个形式:

  • localhost:8080/login
  • localhost:8080/404

用默认的 hash 模式的话,就是这样:

  • localhost:8080/#/login
  • localhost:8080/#/404

都差不多,不过 history 模式好看一点,不过要 支持 HTML5 新特性 history 的浏览器,并且还需要在后端做一些配置 才可以实现~

测试页面

分别打开以下地址:

  • http://localhost:8080/#/
  • http://localhost:8080/#/Login
  • http://localhost:8080/#/404

可以看到不同的信息就说明这一步完成了

老规矩,不贴图哈哈哈

收工~

StarBlog博客Vue前端开发笔记:(2)页面路由的更多相关文章

  1. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  2. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  3. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  4. 前端开发笔记(1)html基础

    HTML介绍 HTML是HyperTextMarkupLanguage超文本标记语言的缩写 HTML是标记语意的语言 编辑器 任何纯文本编辑器都能够编辑html,比如记事本,editplus,note ...

  5. Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转改

    Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v ...

  6. 极客Web前端开发资源大荟萃

    前端开发已经成为当前炙手可热的技术之中的一个.本周我们除了给大家带技术相关资讯,另一些技术人员经常使用的站点.希望大家不要错过我们本周的内容.原文来自:极客标签 为神马说敲代码是非常艰难的 程序猿 做 ...

  7. SpringBoot技术栈搭建个人博客【前台开发/项目总结】

    前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...

  8. web前端开发笔记(2)

    一.什么是作用域. 所有变量都存在于一个执行环境中(也称作用域),这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量.总结: 执行环境有全局执行环境和函数执行环境. 每次进入一个新执 ...

  9. web前端开发笔记(1)

     一.HTML标签书写有哪些规范? 页面编码. 文档声明. 关键字与描述. 行内元素不能包含块级元素. a标签不能嵌套a标签. 标签名和属性必须用小写字母书写,属性必须加引号,标签必须闭合,单标签页必 ...

  10. 极客Web前端开发资源大荟萃#001

    每周极客都将总结本周最精彩的素材提供给大家,希望可以带给你更多地灵感和帮助!极客#GB课程库#现已上线,无论你是初级.中级.还是正在进修的高级前端工程师.这里都将帮助你得到更多更高效的学习.原文:极客 ...

随机推荐

  1. JavaScript – Decimal

    前言 之前就写过一篇 decimal, double, float, 但有点杂乱, 这篇把 JS 的部分独立写成一篇整理版. 参考 JavaScript 浮点数运算的精度问题 关于JavaScript ...

  2. JavaScript – 解构赋值 Destructuring Assignment

    参考 阮一峰 – 变量的解构赋值 Array Destructuring Assignment old school const items = [1, 2, 3]; const item1 = it ...

  3. angular cli, vs code liveserver, vs 2019 iis express 10, vs code kestrel 使用 https + ip

    更新: 2022-03-20 修订版: Vs Code, Visual Studio 2022, Angular and Live Server Running Through Https and I ...

  4. EF Core – Custom Migrations (高级篇)

    前言 会写这篇是因为最近开始大量使用 SQL Server Trigger 来维护冗余 (也不清楚这路对不对). EF Core migrations 没有支持 Trigger Github Issu ...

  5. docker安装运行kafka单机版

    这里我们安装一下kafka的单机版,由于kafka是基于zk进行管理的,如果我们没有安装过zk的话,需要进行安装好zk再安装kafka,当然如果已经安装过了, 那就没必要安装了.我们可以执行docke ...

  6. GPUStack 0.2:开箱即用的分布式推理、CPU推理和调度策略

    GPUStack 是一个专为运行大语言模型(LLM)设计的开源 GPU 集群管理器,旨在支持基于任何品牌的异构 GPU 构建统一管理的算力集群,无论这些 GPU 运行在 Apple Mac.Windo ...

  7. 自己动手,通过源码找回 Ant-Design-Blaozr 中 Tree 组件的搜索筛选效果

    最近更新一个Blazor server的项目,顺带把用到的Ant-Design-Blazor 升级到了最新的 0.14.4,结果发现之前在 0.8.4 版本中 Tree 组件的搜索显示效果变了,从仅显 ...

  8. ZRAM的Swap功能和 SWAP分区有什么区别

    ZRAM(压缩内存块设备)和传统的SWAP分区都是Linux系统中用来增加可用内存的方法,但它们的工作原理和实现方式有很大的区别: ZRAM 压缩内存:ZRAM使用压缩算法将数据存储在内存中.这样,当 ...

  9. 1.2 HELLO 三角形

    这一节,我觉得是相当有难度的.渲染一个三角形,就需要介绍GLSL语言,图形渲染管线(Graphics Pipeline)以及着色器(Shader),标准化设备坐标(NDC)等诸多概念. 图形渲染管线和 ...

  10. Java日期时间API系列29-----Jdk8中java.time包中的新的日期时间API类,Java定时任务job中cron表达式计算应用。

    Java开发过程中经常会用到定时任务job的场景,比如定时处理数据报表等问题,开源作业调度框架也非常多,常用的开源作业调度框架有:Spring Task.Quartz和xxl-job等.各个框架的具体 ...