vue3中,在setup中使用beforeRouteEnter

一、为什么在setup中无法使用beforeRouteEnter

根据vue-router的官方文档,onBeforeRouteLeaveonBeforeRouteUpdate作为组合式 API 函数公开,但并没有对beforeRouteEnter进行公开,所以我们在setup中并不能直接使用beforeRouteEnter。

二、通过新建一个<script lang="ts"></script>标签来解决

1、代码如下
<template>
	<div class="setup-router">SetupRouter</div>
</template>
<script lang="ts">
	import { defineComponent } from 'vue';
	import type { ComponentPublicInstance } from 'vue';
	// 基于ComponentPublicInstance类型对组件的类型进行扩展,添加了handleRouter方法
	interface VmInstance extends ComponentPublicInstance {
		handleRouter(): void;
	}
	// 定义vue组件
	export default defineComponent({
		beforeRouteEnter(to, from, next) {
			console.log(to, '=========to========');
			console.log(from, '=========from========');
			next((vm) => {
				// beforeRouteEnter 守卫 不能 访问 this,
				// 因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。
				// 不过,可以通过传一个回调给 next 来访问组件实例。
				// 在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数
				// 这样在组件被创建之前,就能调用组件内部定义的 handleRouter 方法
				console.log(vm, '================vm============');
				const vmInstance = vm as VmInstance;
				vmInstance.handleRouter();
			});
		},
	});
</script>
<script setup lang="ts">
	defineOptions({
		name: 'SetupRouter',
	});
	// 当路由即将进入该组件时被调用
	const handleRouter = () => {
		console.log('beforeRouteEnter的使用');
	};
	// 使用 <script setup> 的组件是默认关闭的
	// 即通过模板引用或者 $parent 链获取到的组件的公开实例,不会暴露任何在 <script setup> 中声明的绑定。
	// 所以需要 defineExpose 函数将 handleRouter 方法暴露出去
	defineExpose({ handleRouter });
</script>

<style scoped></style>
2、输出结果如下

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值