当前位置: 首页 > news >正文

【Vue路由】props配置、replace属性、编程式路由导航、缓存路由组件

文章目录

  • props配置
    • props值为对象
    • props值为布尔值
    • props值为函数
    • 总结
  • \<router-link>的replace属性
    • 总结
  • 编程式路由导航
    • 案例实现
    • 总结
  • 缓存路由组件
    • 案例实现
    • 总结

props配置

我们可以看看我们原来如何使用传递过来的参数的:
在这里插入图片描述

我们要写一大长串去从$route身上拿到我们想要的数据,现在我们可以借助props配置简化代码。

props值为对象

在这里插入图片描述
然后我们使用的时候只需要注册一下就可以使用了,和父组件向子组件传递数据的那个props使用方法很相似:
在这里插入图片描述
但是这种方法有一些局限性,那就是传递的都是死数据。所以这种放使用的非常少。

props值为布尔值

在这里插入图片描述
然后我们注册id和title,就可以使用了:
在这里插入图片描述

这个方法的局限性也很明显,那就是只能接收到所有的params参数。你要是用query参数传过来的,那就使用不了

props值为函数

这个函数有一个特点:它可以从形参列表中拿到$route对象,有了$route对象,那我们基本上就可以上天下地无所不能。

在这里插入图片描述

其实这个方法就是把原来我们的代码逻辑移动到了另一个地方,让组件里面的代码不那么冗杂。

我们可以在这个方法的基础上利用js语法的特性使其更加精简:
使用js解构赋值:
在这里插入图片描述
使用解构赋值的连续写法:
在这里插入图片描述

总结

路由的props配置

作用:让路由组件更方便的收到参数

{
	name:'xiangqing',
	path:'detail/:id',
	component:Detail,

	//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
	// props:{a:900}

	//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
	// props:true
	
	//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
	props(route){
		return {
			id:route.query.id,
			title:route.query.title
		}
	}
}

<router-link>的replace属性

我们可以看到我们的浏览器左上方有前进和后退键(edge只有后退键):
在这里插入图片描述

它是根据浏览器的历史记录进行工作的

我们以我们前文中的案例为例:
在这里插入图片描述

我们依次点击About、Home、News

浏览器的历史记录是采用栈的形式进行记录的,我们产生的历史记录会以push压栈的形式进入到栈中:
在这里插入图片描述
并且有一个指针指向当前所处页面。

我们每点击依次后退,这个指针就会向栈底的方向移动一位,我们现在可以后退三次:
在这里插入图片描述

如果我们再点击前进,指针又会向栈顶移动一位

对历史记录的操作除了push之外还有replace,也就是替换栈顶的一条记录:
在这里插入图片描述

也就是说我们依次点击About、Home、News之后,栈里面只有/home/news的记录。

默认我们的router-link是使用push方式添加历史记录,如果我们想以replace的方式,可以这样:
在这里插入图片描述

总结

<router-link>的replace属性

  1. 作用:控制路由跳转时操作浏览器历史记录的模式
  2. 浏览器的历史记录有两种写入方式:分别为pushreplacepush是追加历史记录,replace是替换当前记录。路由跳转时候默认为push
  3. 如何开启replace模式:<router-link replace .......>News</router-link>

编程式路由导航

我们现在实现路由的跳转都是使用router-link标签,但是有的时候我们不能使用router-link,因为我们知道router-link的本质是a标签,如果此时我们是一个按钮,去用router-link进行路由跳转的话,这就造成了结构上的紊乱。

这个时候我们就要借助我们的路由器,去操作我们前面提到过的历史记录栈,来实现跳转。

我们以一个案例来进行说明

案例实现

在这里插入图片描述

因为是在前面的代码基础上进行的升级,所以我们只看看Message组件以及上面的前进后退按钮是怎么实现的。

首先我们要知道:我们自己实现路由跳转必须要借助$router原型对象上的方法:
在这里插入图片描述

Message.vue:

<template>
	<div>
		<ul>
			<li v-for="m in messageList" :key="m.id">
				<!-- 跳转路由并携带params参数,to的字符串写法 -->
				<!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; -->

				<!-- 跳转路由并携带params参数,to的对象写法 -->
				<router-link :to="{
					name:'xiangqing',
					query:{
						id:m.id,
						title:m.title
					}
				}">
					{{m.title}}
				</router-link>
				<button @click="pushShow(m)">push查看</button>
				<button @click="replaceShow(m)">replace查看</button>
			</li>
		</ul>
		<hr>
		<router-view></router-view>
	</div>
</template>

<script>
	export default {
		name:'Message',
		data() {
			return {
				messageList:[
					{id:'001',title:'消息001'},
					{id:'002',title:'消息002'},
					{id:'003',title:'消息003'}
				]
			}
		},
		methods: {
			pushShow(m){
				this.$router.push({
					name:'xiangqing',
					query:{
						id:m.id,
						title:m.title
					}
				})
			},
			replaceShow(m){
				this.$router.replace({
					name:'xiangqing',
					query:{
						id:m.id,
						title:m.title
					}
				})
			}
		},
	}
</script>

我们push和replace中传入的配置对象和我们在to中传入的对象一模一样。

再来看看我们的前进后退按钮:
Banner.vue:

<template>
	<div class="col-xs-offset-2 col-xs-8">
		<div class="page-header">
			<h2>Vue Router Demo</h2>
			<button @click="back">后退</button>
			<button @click="forward">前进</button>
			<button @click="test">测试一下go</button>
		</div>
	</div>
</template>

<script>
	export default {
		name:'Banner',
		methods: {
			back(){
				this.$router.back()
				// console.log(this.$router)
			},
			forward(){
				this.$router.forward()
			},
			test(){
				this.$router.go(3)
			}
		},
	}
</script>

说明:

这个go方法可以传入两种参数:

  • 如果传入的是正数,则向前进n次
  • 如果传入的是负数,则向后退n次

总结

编程式路由导航

  1. 作用:不借助<router-link> 实现路由跳转,让路由跳转更加灵活

  2. 具体编码:

    //$router的两个API
    this.$router.push({
    	name:'xiangqing',
    		params:{
    			id:xxx,
    			title:xxx
    		}
    })
    
    this.$router.replace({
    	name:'xiangqing',
    		params:{
    			id:xxx,
    			title:xxx
    		}
    })
    this.$router.forward() //前进
    this.$router.back() //后退
    this.$router.go() //可前进也可后退
    

缓存路由组件

我们有的时候希望切换路由的时候,原路由不会被销毁。

例如下面这种情形:
在这里插入图片描述

我们在News组件中的每个li中加一个输入框,我们在输入框中打一个数字,然后我们切换到Message组件,此时我们再次切换回News组件的时候,我们发现我们输入框里面的东西已经没了。这就是因为News路由组件已经被销毁一次,我们使用的时候才创建。

那么我们怎么不让它被销毁呢?

案例实现

我们直接看Home组件(也就是News的父组件):

在这里插入图片描述

说明:

  • 如果不使用include属性,则此处呈现的路由组件都会被缓存
  • include里面放的是组件名
    在这里插入图片描述

    也就是这里的name后面跟的值

总结

缓存路由组件

  1. 作用:让不展示的路由组件保持挂载,不被销毁。

  2. 具体编码:

    <keep-alive include="News"> 
        <router-view></router-view>
    </keep-alive>
    

相关文章:

  • API接口测试简介
  • 计算机网络(二)Linux网络编程
  • Node.js--》如何在Node.js中操作MySQL
  • GitLab安装使用(SSH+Docker两种方式)
  • lscpu查看cpu信息
  • 【Linux编辑神器:vim】
  • 【数据结构】LeetCode移除链表元素、反转链表、链表的中间结点
  • 计算机组成原理例题
  • 浅谈单元测试
  • 【ARMv8 SIMD和浮点指令编程】Libyuv I420 转 ARGB 流程分析
  • Qt6 中如何使用 qsb
  • Spring中Bean会被缓存吗?Spring的Bean是如何被缓存的?
  • 你真的会做项目经理吗
  • AI修复照片
  • 十三、网络编程、UDP、TCP协议
  • 自己简单写的 事件订阅机制
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • golang 发送GET和POST示例
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • leetcode讲解--894. All Possible Full Binary Trees
  • Node项目之评分系统(二)- 数据库设计
  • QQ浏览器x5内核的兼容性问题
  • XML已死 ?
  • 从零开始的无人驾驶 1
  • 动态规划入门(以爬楼梯为例)
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)357
  • 微信小程序--------语音识别(前端自己也能玩)
  • 移动端唤起键盘时取消position:fixed定位
  • 用Visual Studio开发以太坊智能合约
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​iOS安全加固方法及实现
  • #ifdef 的技巧用法
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (a /b)*c的值
  • (C++)八皇后问题
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六)激光线扫描-三维重建
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • :O)修改linux硬件时间
  • ;号自动换行
  • [20190113]四校联考
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)