"vue-router/composables" 中为什么没有提供 onBeforeRouteEnter?

在 Vue 3 中,vue-router 提供了新的组合式 API(Composables),这些 API 旨在与 Vue 3 的 Composition API 一起使用。然而,onBeforeRouteEnter 这个特定的导航守卫并没有直接在 vue-router/composables 中提供。原因主要有以下几点:

1. 组合式 API 的设计理念

组合式 API 的设计理念是将逻辑拆分为更小的、可重用的单元。vue-router 的组合式 API 也遵循这一理念,提供了一些基本的导航守卫和路由信息的访问方法,而不是直接提供所有可能的守卫。

2. 替代方案

虽然 vue-router/composables 没有直接提供 onBeforeRouteEnter,但你可以使用其他方法来实现类似的功能。以下是一些替代方案:

使用 onBeforeRouteUpdateonBeforeRouteLeave

你可以使用 onBeforeRouteUpdateonBeforeRouteLeave 来实现类似的逻辑。虽然它们不是完全等同于 onBeforeRouteEnter,但在某些情况下可以达到类似的效果。

import { onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router' export default { setup() { onBeforeRouteUpdate((to, from) => { // 在路由更新前执行的逻辑 }) onBeforeRouteLeave((to, from) => { // 在离开当前路由前执行的逻辑 }) return {} } }

使用 beforeRouteEnter 钩子

尽管 vue-router/composables 没有提供 onBeforeRouteEnter,你仍然可以在 setup 函数中使用 beforeRouteEnter 钩子。这个钩子在组件实例被创建之前调用,因此不能访问 this,但可以通过 next 回调传递数据给组件实例。

import { defineComponent } from 'vue' export default defineComponent({ beforeRouteEnter(to, from, next) { // 在进入路由前执行的逻辑 next(vm => { // 通过 vm 访问组件实例 }) }, setup() { // 其他组合式 API 逻辑 return {} } })

3. 为什么不直接提供 onBeforeRouteEnter

  • 复杂性onBeforeRouteEnter 钩子在组件实例被创建之前调用,这使得它在组合式 API 中的实现较为复杂。组合式 API 通常在组件实例已经创建后使用,因此直接提供 onBeforeRouteEnter 可能会导致混淆和复杂性。
  • 灵活性:通过组合式 API,你可以更灵活地组合和重用逻辑。虽然 onBeforeRouteEnter 是一个常用的钩子,但通过其他方法和组合式 API,你可以实现类似的功能,同时保持代码的灵活性和可维护性。

总结

虽然 vue-router/composables 没有直接提供 onBeforeRouteEnter,但你可以使用其他方法(如 beforeRouteEnter 钩子或 onBeforeRouteUpdateonBeforeRouteLeave)来实现类似的功能。这些方法提供了足够的灵活性,使你能够在 Vue 3 的组合式 API 中管理路由导航守卫。

如何解决?

Vue Router 公开的组合式 API 函数 useRoute, useRouter, onBeforeRouteLeave, onBeforeRouteUpdate,

要使用beforeRouteEnter 就要新增一个script

<script lang="ts"> export default { beforeRouteEnter(to, from, next) { console.log("About Page beforeRouteEnter", to, from); if (from.name === "xxx") { next(); } else { window.scrollTo(0, 0); next((e) => { console.log("e", e); }); } }, }; </script>

__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/18537636.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(327)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2023-11-10 concat方法: 用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
2023-11-10 在函数内部修改形参时,不会对实参产生影响
2023-11-10 new是以Date为构造函数产生对象的,Date()是直接调用了构造函数。控制台在输出日期对象时调用了tostring
2023-11-10 innerWidth()是内部宽度,包括padding和内容区
2023-11-10 关于W3C制定的 JavaScript 标准事件模型,先事件捕获从windows > document 往下级直到 特定的事件节点,然后进行事件处理,再事件冒泡,从特定节点往上级,这个完整的过程
2023-11-10 IE中attachEvent中的this总是指向全局对象Window
2023-11-10 静态方法只能由类进行调用,实例方法只能由实例对象进行调用
点击右上角即可分享
微信分享提示