vue-router的学习

news2024/12/23 13:48:48

vue-router

基于Vue做单页面应用时,vue-router可以帮我们将url地址和组件绑定,在我们切换路由组件时,url改变,页面无需从服务端重新加载,即不用刷新,打个比方,我们用美团外卖点外卖时,切换点击左边的菜品标签,若页面总是重新加载,每次重新加载整个页面都闪烁一下,用户的体验很不好。

1. 基本使用

1.1 安装 vue-router:

使用vue2安装对应的router3版本

npm i vue-router@3

使用vue3安装对应的router4版本

npm i vue-router@4

1.2 引入router

在 src 下创建router文件夹,在router文件夹里创建 index.js

/src/router/index.js

//引入Vuerouter
import VueRouter from 'vue-router'
//引入想要展示的路由组件
const router = new VueRouter({
  	routes:[
        {
            path: '/xxx',//url
            component: [路由组件名],//对应的组件名
        },
    ]  
})
export default router

在 main.js 文件中引入并注册路由

main.js

import Vue from 'vue'
import App from './App.vue'
//1. 引入
import VueRouter from 'vue-router'
import router from './router'
Vue.use(VueRouter)

new Vue({
  render: h => h(App),
  //2. 注册
  router
}).$mount('#app')

1.3 使用router

一般在/src/pages下存放路由组件,在/src/components下存放其他组件

1.3.1 路由导航 <router-link>

<router-link> 用来导航显示想展示的组件,本质上就是个超链接标签<a>,有如下属性

:to=“/xxx” --> 去展示对应url对应的组件

active-class=“[class名]” --> 当导航被激活时想展示的class样式

replace --> 切换路由时替换当前浏览器的历史记录

push --> 默认为push,再切换路由时追加浏览器历史记录

1.3.2 路由组件展示<router-view>

<router-view>用于把选择了<router-link>对应的组件展示到<router-view>放置的位置

1.4 简单的路由例子

下方的例子就是一个简单的路由,如果导航被激活,就会显示如图的红色,并在下方展示子组件数据

App.vue

<template>
  <div id="app">
    <ul>
        <li v-for="(item,index) in list" 
            :key="item.id">
        <router-link 
            active-class="router-active" 
            :to="item.path">
        {{ item.name }
        </router-link>
         </li>
    </ul>
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
        list: [
          { id: 2, name: '人员', path: '/persons'},
          { id: 3, name: '新闻', path: '/news' }
        ],
    }
  }
}
</script>

<style scoped>
    * {
      margin: 0;
      padding: 0;
    }
    #app ul {
      display: flex;
      padding: 0 10px;
    }
    #app ul li {
      width: 100px;
      height: 50px;
      line-height: 50px;
      list-style: none;
      text-align: center;
      border: 1px solid black;
    }
    #app ul li a {
      display: block;
      text-decoration: none;
      font-weight: bold;
      color: #333333;
    }
     .router-active{
      background-color: #e01222;
      color: #fff;
     }
</style>

/router/index.js

import VueRouter from "vue-router"
//引入想要用的组件
import PersonList from "@/pages/PersonList.vue"
import News from "@/pages/News.vue"
const router = new VueRouter({
    routes: [
        {
            path: '/persons',
            component: PersonList
        },
        {
            path: '/news',
            component: News
        }
        
    ]
})
export default router

/pages/News.vue

<template>
    <div>
        <h3>新闻列表</h3>
        <li v-for="item in NewsList" :key="item.id">
            {{item.title}}
        </li>
    </div>
</template>

<script>
    
    export default{		
        name: '',
        data(){
            return{
                NewsList: [
                    {id:'001',title:'新闻1', path: '/new'},
                    {id:'002',title:'新闻2', path: '/new'},
                    {id:'003',title:'新闻3', path: '/new'},
                ]
            }
        },
    }
</script>

/pages/PersonList.vue

<template>
    <div>
        <ul>
            <li v-for="(item) in personList" :key="item.id">
                {{item.id}} - {{ item.pName }} - {{ item.age }}
            </li>
        </ul>
    </div>
</template>

<script>
    export default{		
        name: '',
        data(){
            return{
                personList : [
                    {id:'001',pName:'tom',age:18},
                    {id:'002',pName:'jerry',age:19},
                    {id:'003',pName:'tony',age:12},
                ],
            }
        }
    }
</script>

在这里插入图片描述

在这里插入图片描述

2. 进阶使用

2.1 多级路由

多级路由是在/router/index.js中routes中的对象中配置children属性,在children里配置下一级路由的映射规则

import VueRouter from "vue-router"
const router = new VueRouter({
    routes: [
        {
            path: '/xxx',
            component: xxx,
            //多级路由配置children属性
            children: [
                {
                    path: 'yy',//记住不要加/ 
                    component: yy
                }
            ]
        }
    ]
})
export default router

此时我们访问到配置的这个子路由的<router-link>的 :to 属性应该写完整的路径,即

<router-link :to="/xxx/yy"></router-link>

2.2 $router 和 $route

$route存放着该组件的路由信息,每个路由组件对象都有$route,可以传递接参数等等

$router是vue路由对象,只会存在一个,可以借助this.$router的api实现编程式路由导航

2.3 路由传参

传参有query传参和param传参两种方式,我们通过在路由组件里的 this.$route.[query / param]获取

二者的字符串写法都支持模板字符串,模版字符串用``围起来,里面可以通过 ${变量名} 获取变量,拼接成字符串

2.3.1 query传参

传递参数都是在<router-link>的 to 属性传递,传递方式有字符串写法和对象写法,获取则是通过 this.$route.query.[变量名]

//1.字符串写法
//传递:在<router-link>的to属性通过url传递,即 
			to=“/xx?a=a&b=b”
//2. 对象写法
// to="
{
	path: '/xx',
	query:{
		a:a,
		b:b
	}
}
"
2.3.2 params传参

传递参数都是在<router-link>的 to 属性传递,传递方式有字符串写法和对象写法,获取则是通过 this.$route.params.[变量名]

//1. 字符串写法
to="/xx/a/b"
//这种写法需要在route里匹配路径时占位
// /router/index.js

const router = new VueRouter({
    routes: [
        {
            path: '/xx/:school', // [/:变量名] 实现占位,传多少个参数就占多少位
            component: PersonList
        }    
    ]
})
//2. 对象写法
//这种写法需要配置route的name属性,见文章2.4 路由取名
// 配置 name 和 params
to="{
    name: [路由name属性名,即aa],
    params: {
        a : a,
        b : b
    }
}"

// /router/index.js
// 注意 name、path
const router = new VueRouter({
    routes: [
        {
        	name: 'aa'
            path: 'xx/:a', //占位
            component: PersonList
        }    
    ]
})

2.4 路由取名

我们可以给路由取名,通过 to=“[路由名]” 即可访问

const router = {
    routes: [
        {
        	//取名
        	name: 'aaa',
            path: '/xxx',
            component: xxx,
            //多级路由配置children属性
            children: [
                {
                    path: 'yy',//记住不要加/ 
                    component: yy
                }
            ]
        }
    ]
}
//访问
<router-link :to="aaa"></router-link>

2.5 缓存路由

我们在切换同级路由时,切换走的路由组件会被销毁,切换到的路由组件会被创建,有时候我们希望切换组件时,保留该组件现有的数据,即不销毁掉该路由组件,这就是缓存路由

缓存路由通过<keep-alive>标签的include属性控制,如果想缓存多个路由,则用 :include=“[‘a组件’, ‘b组件’]”,需要在组件里配置name属性,若没配置include则所有都缓存

<keep-alive :include="['xx']">
    <router-view></router-view>
</keep-alive>

2.6 路由组件的生命周期函数

引入: 一个路由组件有定时器,并且keep-alive 了,我们不希望定时器在切换的时候依旧执行

解决上述问题,我们可以通过路由组件的activated、deactivated 两个生命周期函数,在路由组件激活时开始,路由切换时关闭即可,这两个生命周期函数仅在<keep-alive>包含当前组件时才会有

activated 路由组件被激活时激活

deactivated 路由组件被切换的时候激活

2.7 路由守卫

引入 : 有些路由组件需要判断权限,没权限就不给看

2.7.1 全局前置路由守卫

配置在 /router/index.js 里,路由组件的初始化和每次切换时调用

一般用于权限控制

/router/index.js

// to : 目标路由
// from : 从哪个路由切换的,是一个Object对象
// next	: 要切换到哪个路由,是一个Object对象
router.beforeEach((to, from, next) -> {
	//权限验证
	next(); //放行
})
2.7.2 全局后置路由守卫

配置在 /router/index.js 里,路由组件的初始化和每次切换后调用

/router/index.js

// to : 目标路由,是一个Object对象
// from : 从哪个路由切换的,是一个Object对象
//由于是在路由器切换后调用的,所以不需要 next
router.afterEach((to, from) -> {
    
})
2.7.3 独享前置路由守卫

只有前置,没有后置,配置在 /router/index.js 里,存在该独享前置路由守卫的路由组件被激活时触发

/router/index.js

routes = new VueRouter({
{
    path: '/xx',
    beforeEnter:(to, from, next) => {
    	
    	next();//放行
    }
})
2.7.4 组件内路由守卫

配置在路由组件里

beforeRouteEnter() 在切换到该路由组件时调用

beforeRouteLeave() 在离开该路由组件时前调用

//通过路由规则进入时调用
beforeRouteEnter(to, from, next) {
	
	next(); //放行
}
//通过路由规则离开前调用
beforeRouteLeave(to, from, next) {

	next(); //放行
}
2.7.5 路由守卫的执行顺序

如果各种守卫都配置了,

路由组件初始化时,触发顺序如下:

全局前置路由守卫 -> 全局后置路由守卫

组件被激活时,触发顺序如下:

全局前置路由守卫 -> 独享前置路由守卫 -> 组件内路由前置守卫 -> 全局后置路由守卫

组件被切换走时,触发顺序如下:

组件内路由离开守卫 -> 全局前置路由守卫 -> 全局后置路由守卫

2.8 路由器的工作模式

工作模式通过router的mode属性配置,有history 和 hash 两种,默认是hash

hash : 只有#之前的url会随着请求会发给服务器,不会带上路由组件的url

history : 会把我们配置的路由组件的url也带上

打个比方:

// 我们想请求的地址 : https://localhost:8080/students
// 此时,我们在路由组件Person准备发送请求,即此时的url为:  https://localhost:8080/#/person
// 我们发送 /students 的请求
// history : https://localhost:8080/person/students
// hash : https://localhost:8080/person
// 此时,history当前请求不到资源

修改路由的工作模式如下:

const router = new VueRouter({
	mode: ['hash' / 'history'],
	routes: [
		
	]
})

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

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

相关文章

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

【强化学习】第02期:动态规划方法

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程&#xff0c;计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处&#xff0c;敬请批评指正。 文章目录 2.1 动态规划&#xff1a;策略收敛法/策略迭代法2.2 动态规划&#xf…

C# SocketUDP服务器,组播

SocketUDP 自己即是服务器又是客户端 &#xff0c;在发消息只需要改成对方ip和端口号即可 前提对方必须开启服务器 socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.107.72"), 8080)); 控件&#xff1a;Button,TextBox,RichTextBox 打开自己服务器 public…

C++编译时引入json/nlohmann文件报错

报错信息: In file included from /home/chenlang/catkin_ws/src/leanrning_communication/src/mysql/../utils/data.h:14:0,from /home/chenlang/catkin_ws/src/leanrning_communication/src/mysql/MyRobotDb.h:32,from /home/chenlang/catkin_ws/src/leanrning_communicatio…

K8S 角色/组件及部署方式的简单概述

1.宏观架构图 2.角色详情 2.1 Master(Controller Plane) 早期是叫 Master 节点&#xff0c;后期改名为 Controller Plane&#xff0c;负责整个集群的控制和管理 Master 不会干活的(当然你让它干也是会干的&#xff0c;涉及到污点容忍)&#xff0c;而是起到访问入口&#xff…

Java编程基本功大揭秘 | 详解深入分析Java线程池源码和底层原理,掌握实战技巧【1】

详解深入分析Java线程池源码和底层原理 文章大纲引言Java线程池概念及重要性 ThreadPoolExecutor类的概述ThreadPoolExecutor类的基本功能和作用**基本功能****核心作用** ThreadPoolExecutor主要构造函数及其参数继承关系链功能介绍ThreadPoolExecutor 构造器构造器参数构造器…

单源最短路径问题(Dijstra)

#include<iostream> using namespace std; #define MAX 500 #define INT 999 typedef struct {char vex[MAX];int Edge[MAX][MAX];int vexnum,arcnum; }MGraph; void InitMG(MGraph &MG) {cout<<"输入顶点数和边数&#xff1a;";cin>>MG.vexnu…

代码随想录算法训练营第三十七天|01背包问题、分割等和子集

01背包问题 题目链接&#xff1a;46. 携带研究材料 文档讲解&#xff1a;代码随想录 状态&#xff1a;忘了 二维dp 问题1&#xff1a;为啥会想到i代表第几个物品&#xff0c;j代表容量变化&#xff1f; 动态规划中&#xff0c;每次决策都依赖于前一个状态的结果&#xff0c;在…

创新实训(十三) 项目开发——实现用户终止对话功能

思路分析&#xff1a; 如何实现用户终止AI正在进行的回答&#xff1f; 分析实现思路如下&#xff1a; 首先是在用户点击发送后&#xff0c;切换终止对话&#xff0c;点击后大模型终止对话&#xff0c;停止sse&#xff0c;不再接收后端的消息。同时因为对话记录存入数据库是后…

MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.

【问题描述】 MySQL 8.4版本&#xff0c;配置用户使用mysql_native_password认证插件验证用户身份&#xff0c;报错&#xff1a; 【解决方法】&#xff08;Windows, MySQL 8.4) 1、修改MySQL配置文件my.ini&#xff0c;在[mysqld]段添加mysql_native_passwordON。 2、管理员…

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…

计算机体系结构 量化研究方法

在第一章中看到关于微处理器中dynamic energy 和 dynamic power的定义觉得有些奇怪&#xff0c;特别记录一下。 上面的定义是取决于上下文的&#xff1a;动态能量可以理解为在一个时钟周期内&#xff0c;由电容充放电消耗的能量总和&#xff0c;而动态功率则是这种能量消耗在单…

运算放大器输出相位反转和输入过压保护

运算放大器输出电压相位反转 本教程讨论两个与运算放大器相关的话题&#xff1a;输出相位反转和输入过压保护。 超过输入共模电压(CM)范围时&#xff0c;某些运算放大器会发生输出电压相位反转问题。其原因通常是运算放大器的一个内部级不再具有足够的偏置电压而关闭&#xff…

面试-Redis常见场景

1.从海量的数据里查询某一固定前缀的key (1)keys pattern指令&#xff1a; 摸清数据规模(很重要) (2)cursor&#xff1a;游标 Scan cursor [MATCH pattern] [COUNT count] 可以无阻塞的提取出指定模式的key列表 基于游标的迭代器&#xff0c;需要基于上一次的游标延续之前的迭…

【仿真建模-anylogic】开发规范

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 说明 实际模型开发过程中&#xff0c;对遇到的问题进行总结归纳出以下开发规范&#xff0c;仅供参考&#xff01; 1. 强制性规范 1…

云动态摘要 2024-06-28

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [新客专享]WeData 限时特惠 腾讯云 2024-06-21 数据分类分级管理&#xff0c;构建数据安全屏障 &#xff0c;仅需9.9元&#xff01; 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器…

使用QGIS进行研究区域制图实战

目录 前言 一、QGIS的版本和数据介绍 1、关于QGIS版本 2、需要准备的数据 二、准备制图 1、制作全国区位图 2、矢量和遥感信息的编辑 三、出图编辑 1、设置主题信息 2、打印布局制作 3、美化地图 总结 前言 俗话说“一图胜千言”&#xff0c;在地理信息的领域中&…

“AI+”时代,群核科技进化成了家居设计打工人理想的样子

6月&#xff0c;2024世界智能产业博览会上&#xff0c;人工智能大模型展团以“AI大模型驱动新质生产力”为主题&#xff0c;各家企业纷纷提到了基于不同行业场景的应用。 这透露出当前的行业发展趋势强调大模型落地核心行业&#xff0c;产生业务价值。其中&#xff0c;“AI图像…

车辆轨迹预测系列 (五):Argoverse API Forecasting Tutorial代码解析

车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析 文章目录 车辆轨迹预测系列 (五)&#xff1a;Argoverse API Forecasting Tutorial代码解析一、argoverse.data_loading.argoverse_forecasting_loader二、argoverse.visualization.visualize_seq…

MTK8786/MT8786芯片性能参数_规格书_datasheet

联发科MT8786(MTK8786)处理器采用了台积电12纳米FinFET技术&#xff0c;由2个Cortex A75核心和6个Cortex A55核心组成&#xff0c;其中大核A75主频为2.0GHz&#xff0c;GPU采用了ARM Mali-G52。MTK8786芯片设计极大地提升了智能设备的性能和安全等级。 MT8786采用了安全的ISP设…