vue进阶----路由

news2024/11/15 8:34:14

目录

前端路由的概念与原理

什么是路由

SPA 与前端路由

前端路由

前端路由的工作方式

实现简易的前端路由

vue-router 的基本用法

vue-router

vue-router 安装和配置的步骤

声明路由的匹配规则

vue-router 的常见用法

1、路由重定向

2、嵌套路由

3、动态路由匹配

4、声明式导航 & 编程式导航


前端路由的概念与原理

什么是路由

路由(英文:router)就是 对应关系

SPA 与前端路由

SPA 指的是一个 web 网站只有唯一的一个 HTML 页面, 所有组件的展示与切换 都在这唯一的一个页面内完成。 此时, 不同组件之间的切换 需要通过 前端路由 来实现。
结论:在 SPA 项目中, 不同功能之间的切换 ,要 依赖于前端路由 来完成!

前端路由

通俗易懂的概念: Hash 地址 组件 之间的 对应关系

前端路由的工作方式

  1. 用户点击了页面上的路由链接
  2. 导致了 URL 地址栏中的 Hash 值发生了变化
  3. 前端路由监听了到 Hash 地址的变化
  4. 前端路由把当前 Hash 地址对应的组件渲染都浏览器中

 

结论:前端路由,指的是 Hash 地址 组件之间 对应关系

实现简易的前端路由

步骤1:通过 <component> 标签,结合 comName 动态渲染组件

<component :is="comName"></component>

export default {
data(){
    return{
      comName: 'Home'
    }
  },
}
步骤2:在 App.vue 组件中,为 <a> 链接 添加对应的 hash 值
步骤3:在 created 生命周期函数中,监听浏览器地址栏中 hash 地址的变化 ,动态切换要展示的组件的名称:
 created() {
    window.onhashchange = () => {
      console.log('监听到了 hash 地址的变化', location.hash)
      switch (location.hash) {
        case '#/home':
          this.comName = 'Home'
          break
        case '#/movie':
          this.comName = 'Movie'
          break
        case '#/about':
          this.comName = 'About'
          break
      }
    }
  },

vue-router 的基本用法

vue-router

vue-router 是 vue.js 官方给出的 路由解决方案 。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目 中组件的切换。
vue-router 的官方文档地址:https://router.vuejs.org/zh/

vue-router 安装和配置的步骤

  1. 安装 vue-router 包
  2. 创建路由模块
  3. 导入并挂载路由模块
  4.  声明路由链接占位符

在项目中安装 vue-router

npm i vue-router@3.5.2 -S
创建路由模块
src 源代码目录下,新建 router/index.js 路由模块,并初始化如下的代码:
// src/router/index.js 就是当前项目的路由模块
import Vue from 'vue'
import VueRouter from 'vue-router'

// 把 VueRouter 安装为 Vue 项目的插件
// Vue.use() 函数的作用,就是来安装插件的
Vue.use(VueRouter)

// 创建路由的实例对象
const router = new VueRouter()

//向外共享实列对象
export default router

导入并挂载路由模块
在 src/ main.js 入口文件中,导入并挂载路由模块。示例代码如下:
//导入router模块
import router from '@/router/index.js'


new Vue({
  render: h => h(App),
// 在 Vue 项目中,要想把路由用起来,必须把路由实例对象,通过下面的方式进行挂载
  router: router
}).$mount('#app')
声明 路由链接 占位符
在 src/App.vue 组件中,使用 vue-router 提供的 <router-link> <router-view> 声明路由链接和占位符:
 <!-- 定义路由链接 -->
 <!-- 当安装和配置了 vue-router 后,就可以使用 router-link 来替代普通的 a 链接了 -->
   <!-- <a href="#/home">首页</a> -->
    <router-link to="/home">首页</router-link>
    
    <router-link to="/movie">电影</router-link>
   <router-link to="/about">关于</router-link>

    <hr />

    <!-- 只要在项目中安装和配置了 vue-router,就可以使用 router-view 这个组件了 -->
    <!-- 它的作用很单纯:占位符 -->
  <router-view></router-view>

声明路由的匹配规则

在 src/router/index.js 路由模块中,通过 routes 数组声明路由的匹配规则。示例代码如下:

// 1、导入需要的组件
import Home from '@/components/Home.vue'
import Movie from '@/components/Movie.vue'
import About from '@/components/About.vue'

// 2、创建路由的实例对象
const router = new VueRouter({
// routes 是一个数组,作用:定义 “hash 地址” 与 “组件” 之间的对应关系
  routes: [
   //path 表示匹配的是 hash 地址 ;component 表示要匹配的路由组件
    {path: '/home', component: Home},
    {path: '/movie', component: Movie},
    {path: '/about', component: About}
  ]
})

vue-router 的常见用法

1、路由重定向

路由重定向 指的是:用户在访问 地址 A 的时候, 强制用户跳转 到地址 C ,从而展示特定的组件页面。 通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:
const router = new VueRouter({
  routes: [
    //重定向路由规则
    {path: '/', redirect: '/home'},
    //路由规则
    {path: '/home', component: Home},
    {path: '/movie', component: Movie},
    {path: '/about', component: About}
  ]
})

2、嵌套路由

通过路由实现 组件的嵌套展示 ,叫做嵌套路由。
点击 父级路由链接 显示模板内容
  1.  模板内容中又有子级路由链接
  2. 点击子级路由链接显示子级模板内容

声明子路由链接子路由占位符

About.vue 组件中,声明 tab1 和 tab2 的子路由链接以及子路由占位符。示例代码如下:

<h3>About 组件</h3>

    <!-- 子级路由链接 -->
    <router-link to="/about/tab1">tab1</router-link>
    <router-link to="/about/tab2">tab2</router-link>

    <hr>
    <!-- 子级路由占位符 -->
    <router-view></router-view>
通过 children 属性声明 子路由规则
在 src/router/index.js 路由模块中,导入需要的组件,并使用 children 属性 声明子路由规则:
import Tab1 from '@/components/tabs/Tab1.vue'
import Tab2 from '@/components/tabs/Tab2.vue'

const router = new VueRouter({
  routes: [
    
    {//父级路由规则
      path: '/about',
       component: About, 
        //重定向路由 
       //redirect: '/about/tab1',
    children:[
      // 子路由规则 不要/ 
      // 默认子路由:如果 children 数组中,某个路由规则的 path 值为空字符串,则这条路由规则,叫做“默认子路由”
      
      {path: '',component: Tab1 }, //为空时 子路由链接的后面/Tab1 值就不需要了
      {path: 'tab2',component: Tab2 }
    ]}
  ]
})

3、动态路由匹配

路由规则的 复用性差
动态路由的概念
动态路由指的是:把 Hash 地址中 可变的部分 定义为 参数项 ,从而 提高路由规则的复用性
在 vue-router 中使用 英文的冒号 : )来定义路由的参数项。示例代码如下:
 {path: '/movie/:id', component: Movie},
$route.params 参数对象
动态路由 渲染出来的组件中,可以使用 this. $route.params 对象访问到 动态匹配的参数值
这里的id值与参数项对应
<h3>Movie 组件 -- {{ $route.params.id  }}</h3>

<!-- this.$route 是路由的“参数对象” -->

<!-- this.$router 是路由的“导航对象” -->

使用 props 接收路由参数
为了简化路由参数的获取形式 ,vue-router 允许在 路由规则 开启 props 传参 。示例代码如下:
//定义路由规则时 开启props : true 选项
{path: '/movie/:id', component: Movie,props: true},

//直接使用
 <h3>Movie 组件 --  --- {{ id }}</h3>


//使用props 可以直接接收路由参数

 props:['id']
<!-- 注意1:在 hash 地址中, / 后面的参数项,叫做“路径参数” -->
    <!-- 在路由“参数对象”中,需要使用 this.$route.params 来访问路径参数 -->

    <!-- 注意2:在 hash 地址中,? 后面的参数项,叫做“查询参数” -->
    <!-- 在路由“参数对象”中,需要使用 this.$route.query 来访问查询参数 -->

    <!-- 注意3:在 this.$route 中,path 只是路径部分;fullPath 是完整的地址 -->
    <!-- 例如: -->
    <!-- /movie/2?name=zs&age=20 是 fullPath 的值 -->
    <!-- /movie/2 是 path 的值 -->

4、声明式导航 & 编程式导航

在浏览器中, 点击链接 实现导航的方式,叫做 声明式导航 。例如:
  •  普通网页中点击 <a> 链接、vue 项目中点击 <router-link> 都属于声明式导航
在浏览器中, 调用 API 方法 实现导航的方式,叫做 编程式导航 。例如:
  •  普通网页中调用 location.href 跳转到新页面的方式,属于编程式导航
vue-router 中的编程式导航 API
vue-router 提供了许多编程式导航的 API,其中最常用的导航 API 分别是:
this.$router. push ('hash 地址')
  • 跳转到指定 hash 地址,并增加一条历史记录
     methods: {
        gotoLk(){
          this.$router.push('/movie/1')
        }
      }
this.$router. replace ('hash 地址')
  • 跳转到指定的 hash 地址,并替换掉当前的历史记录

push 和 replace 的区别:
  • push 会增加一条历史记录
  •  replace 不会增加历史记录,而是替换掉当前的历史记录
this.$router. go (数值 n)
  • 实现导航历史前进、后退
     gotof(){
     // 如果后退的层数超过上限,则原地不动
          this.$router.go(-1)
        }

$router.go 的简化用法

在实际开发中,一般只会前进和后退一层页面。因此 vue-router 提供了如下两个便捷方法:
$router. back ()
  •  在历史记录中,后退到上一个页面
$router. forward ()
  •  在历史记录中,前进到下一个页面
 <!-- 在行内使用编程式导航跳转的时候,this 必须要省略,否则会报错! -->
    <button @click="$router.back()">back 后退</button>
    <button @click="$router.forward()">forward 前进</button>
5、导航守卫
导航守卫 可以 控制路由的访问权限
全局前置守卫
每次发生路由的 导航跳转 时,都会触发 全局前置守卫 。因此,在全局前置守卫中,程序员可以对每个路由进行 访问权限 的控制:

// 创建路由的实例对象


// 为 router 实例对象,声明全局前置导航守卫
// 只要发生了路由的跳转,必然会触发 beforeEach 指定的 function 回调函数
router.beforeEach(function(){})
守卫方法的 3 个形参
router.beforeEach(function(to,from,next){
 // to 表示将要访问的路由的信息对象
  // from 表示将要离开的路由的信息对象
  // next() 函数表示放行的意思
  next()

})
next 函数的 3 种调用方式

 

  1. 当前用户拥有后台主页的访问权限,直接放行:next()
  2. 当前用户没有后台主页的访问权限,强制其跳转到登录页面:next('/login')
  3. 当前用户没有后台主页的访问权限,不允许跳转到后台主页:next(false)

控制后台主页的访问权限

if (to.path === '/mian') {
    // 要访问后台主页,需要判断是否有 token
    const token = localStorage.getItem('token')
    if (token) {
      next()
    } else {
      // 没有登录,强制跳转到登录页
      next('/login')
    }
  } else {
    next()
  }

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

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

相关文章

Stable Diffusion高阶技能(1)-掌握这些,你也能绘出惊艳画作

开篇 初踏入AI作画的世界,你可能会对如何制造出惊艳的艺术作品而困惑。作为一个前沿技术的探索者,我在这一篇文章中,会和你一同揭秘如何用正确的提示词操控AI的“透视”,将最美的画面展现在你眼前。 技能一、提高图片质量的高阶手法 在数量众多的元素中,我们如何做出最…

Vue组件库Element-常见组件-Form表单

Form表单 Form 表单&#xff1a;由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、检验、提交数据 具体关键代码如下&#xff1a; <template><div><el-row><!-- button 按钮 --><el-button>默认按钮</el-button><e…

DDPM 知识点

Generative Modeling by Estimating Gradients of the Data Distribution | Yang Song Score Matching 系列 (一) Non-normalized 模型估計 | 棒棒生

基于单片机智能饮水机加热系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前水温&#xff0c;定时提醒&#xff0c;水量变化DS18B20检测当前水体温度&#xff1b;水位传感器检测当前水位&#xff1b;继电器驱动加热片进行水温加热&#xff1b;定时提醒喝水&#xff0c;蜂鸣器报警&#x…

一键报警终端怎么样

一键报警终端是一种便携式设备&#xff0c;用于紧急情况下的一键求救。通过一键报警终端&#xff0c;用户可以发送紧急求助信号给预设的联系人或报警中心&#xff0c;以便及时获得救援。一键报警终端的主要功能和特点如下&#xff1a;1. 便携式设计&#xff1a;一键报警终端通常…

【Android studio】学号及姓名的输入保存页面

一、设计需求 设计一个页面有两个编辑框&#xff0c;分别输入学号和姓名。有两个按钮&#xff0c;一个是修改按钮&#xff0c;当按下修改按钮&#xff0c;编辑框可以进行编辑&#xff1b;一个是保存按钮&#xff0c;当按下保存按钮&#xff0c;使编辑框显示当前的内容并且编辑…

在线性能分析工具Arthas基于Springboot安装配置使用和Arthas Tunnel安装配置使用

概要 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类加…

Python Web开发入门教程(非常详细)

Python是一种非常流行的编程语言&#xff0c;被广泛应用于数据科学、Web开发、人工智能、机器学习等领域。Python语言易学易用&#xff0c;是许多初学者进入编程世界的入门选择。然而&#xff0c;学习Python并不是一件简单的事情&#xff0c;尤其是对于初学者而言。在本文中&am…

深度学习——优化器Optimizer

代码以及详细注释&#xff1a; import torch import torch.utils.data as Data import torch.nn.functional as F import matplotlib.pyplot as plt# torch.manual_seed(1) # reproducible """超参数 """ # 学习率 LR 0.01 # 批大小 BATCH_…

API测试之Postman使用完全指南

前言 Postman是一个可扩展的API开发和测试协同平台工具&#xff0c;可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman 工具有 Chrome 扩展和独立客户端&#xff0c;推荐安装独立客户端。 Postman 有个 workspace 的概念&#xff0c;workspace 分 pers…

16、Python读取气象数据的正确姿势

文章目录 一、气象数据格式&#xff08;常用&#xff09;二、单个文件读取1. 常规格式2. CSV格式3. NetCDF格式4. GRIB格式 一、气象数据格式&#xff08;常用&#xff09; 常规格式&#xff08;Plain Text&#xff09;&#xff1a;气象数据可以使用纯文本格式进行存储&#xf…

漏洞复现 || 某友文件上传

免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此…

HarmonyOS学习路之开发篇—流转(跨端迁移 一)

跨端迁移开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口&#xff0c;实现跨端迁移。 1. 设备A上的应用FA向流转任务管理服务注册一个流转回调&#xff1a; Alt1-系统推荐流转&#xff1a;系统感知周边有可用设备后&#xff0c;主动为用户提…

网络版本的计算器

文章目录 1. TCP协议通讯流程2. 应用层2.1 再谈 "协议" 3. 网络版计算器3.1 服务器提供服务3.1.1 提取有效载荷3.1.2 服务器的反序列化3.1.3 计算服务3.1.4 服务器的序列化3.1.5 添加序列化后的长度 3.2 客户端发送请求3.2.1 填充客户端请求3.2.2 客户端进行序列化3.…

为什么我挖不倒sql注入啊!

为什么我挖不倒sql注入啊&#xff01; 背景一句话讲原理小白速挖注入 背景 不知道是不是初学安全的小伙伴都和我一样&#xff0c;刚开始学的时候&#xff0c;诶挺简单啊&#xff01;我咋这么聪明一学就会&#xff0c;靶场轻轻松松过关&#xff0c;到了实战根本挖不出来&#x…

【C++】float / double 与 0 值比较

【C】float / double 与 0 值比较 文章目录 【C】float / double 与 0 值比较1. 概述不同1.1 - float 与 double 实际存储1.2 - C 语言与 C 中不同 2. 比较方法2.1 - C 风格比较2.2 - 使用 limits 函数 3. 参考链接 References 1. 概述不同 当然使用普通的比较没有问题&#xf…

项目管理中,WBS与项目计划有什么区别?

为了成功完成项目并控制成本&#xff0c;我们有必要采取科学的项目管理方法。实现这一目标的工具是项目计划和工作分解结构&#xff08;WBS&#xff09;。 WBS 与项目计划是项目管理中必不可少的工具&#xff0c;但两者有不同的用途。WBS精确描述了项目工作和可交付成果&#…

前端vue入门(纯代码)26_多级路由

如果耐不住寂寞&#xff0c;你就看不到繁华。 【24.Vue Router--多级路由】 [可以去官网看看Vue Router文档](嵌套路由 | Vue Router (vuejs.org)) 在实际开发中&#xff0c;我们不单单会使用到一层路由&#xff0c;有时候会涉及到两层或两层以上的路由&#xff0c;多级路由…

带清除按钮的输入框

// index.html <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1"><title>测试 - layui</title><link rel&…

Gof23设计模式之桥接模式

1.概述 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。它的核心思想就是将一个大类或一系列紧密关联的类拆分成两个独立的抽象和实现部分&#xff0c;以便能够更加灵活地扩展…