uni-app - 实现监听路由跳转,每次跳转的时候都能触发的事件(当页面路由发生变化时,触发一个封装好的请求接口或普通功能函数)全端兼容,高效简洁无 BUG 详细教程

本文介绍如何在uni-app中实现全端兼容的路由跳转监听,当页面路由变化时自动触发预设函数,包括兼容uniapp v2/v3的实现代码,注意事项,以及如何处理微信小程序Tabbar页面的监听问题。通过uni.addInterceptor实现拦截器,确保每个页面路由变化时都能执行特定功能,如请求接口或执行自定义逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

当用户点击任意页面时(路由发生变化),自动执行一个函数,调用接口请求数据、做任何事情。

由于涉及到全部页面,必须采用统一的入口和统一的执行函数,不可能一个页面写一次!!

支持 uniapp v2 / v3 版本,基于这个需求,本文实现了 全局统一监听路由跳转,当页面发生变化时自动触发某个函数,


如下图所示,无论是 navigateTo redirectTo reLaunch switchTab navigateBack 跳转的页面,只要跳页面了都会执行:

使用本文的方法,您可以自由控制如上路由跳转 API 哪些不监听(比如不想监听 reLaunch 路由跳转)。

在这里插入图片描述

实现代码

以下示例

<think>好的,我现在需要帮助用户解决关于uni-app监听页面生命周期变化的问题。用户提到了onShow和onHide,但不确定如何监听这些页面级别的生命周期函数。首先,我应该回顾uni-app的生命周期结构,确保自己理解正确。 根据用户提供的引用内容,uni-app的生命周期分为应用、页面和组件三个层次。应用生命周期如onLaunch、onShow、onHide等,这些是局的,但页面生命周期如onLoad、onShow、onShow是页面级别的,每个页面单独触发。用户的问题是如何监听页面变化,比如所有页面的onShow和onHide事件。 接下来,我需要确认uni-app官方是否有直接支持监听页面生命周期的方法。根据引用内容,应用生命周期中的onShow和onHide是应用级别的,当应用从后台进入前台反之触发,而不是针对单个页面的切换。而页面生命周期的onShow和onHide属于各个页面自己的事件,无法直接通过应用生命周期来局捕获。 因此,用户可能需要一种方法来在每个页面的生命周期事件触发,执行一些局的逻辑。这候,通常的做法是使用局混入(mixins)者拦截页面跳转的方法。例如,在main.js中使用Vue.mixin来为每个页面的生命周期添加钩子函数,这样每当任何页面的onShowonHide被触发局的代码就会执行。 另外,还有一种方法是使用uni-app事件监听机制,比如uni.$on和uni.$emit,但需要结合页面生命周期手动触发事件。例如,在每个页面的onShow中触发一个自定义事件,然后在监听这个事件。不过这种方法需要修改每个页面的代码,可能不够方便。 者,可以考虑使用页面栈的变化监听页面切换,比如在应用的onShow中检查当前页面栈的信息,但这可能不够精确,因为应用进入后台和前台也会触发onShow,而不仅仅是页面切换。 综合来看,最可行的方法应该是使用局混入,在main.js中通过Vue.mixin为所有页面的生命周期添加钩子,从而在监听页面级别的onShow和onHide。同,需要说明应用级别的onShow和onHide的触发机与应用状态相关,而非页面切换,避免用户混淆。 此外,还要注意uni-app页面生命周期和Vue的生命周期可能有所区别,需要引用正确的文档部分。例如,引用[4]提到了页面生命周期如onLoad、onShow等,而应用生命周期在app.vue中定义。因此,局混入的代码应该放在main.js中,并且在每个页面加载自动注入这些钩子。 最后,需要验证这种方法的可行性,比如创建一个简单的uni-app项目,在main.js中添加局混入代码,然后在不同页面切换查看控制台输出,确认局钩子是否被正确触发。这样可以确保回答的准确性,避免给用户错误的信息。</think>在 uni-app 中,**监听页面生命周期变化(如页面显示/隐藏)需结合应用生命周期和页面栈管理**,因为页面级的 `onShow`/`onHide` 是各自独立的,无法直接监听。以下是两种实现方案: --- ### 方案一:通过应用生命周期监听页面变化 **应用级 `onShow`/`onHide` 可监听应用前后台切换**,但若需监听页面层级变化,需结合页面栈分析: ```javascript // app.vue 中定义 export default { onShow(options) { const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; console.log('应用进入前台,当前页面:', currentPage.route); // 可在此触发局逻辑 }, onHide() { console.log('应用进入后台'); } } ``` *此方法仅能监听应用状态变化,无法精确到页面切换*[^2][^3]。 --- ### 方案二:局混入页面生命周期(推荐) **通过 Vue 的局混入(mixin)监听所有页面的生命周期**: ```javascript // main.js 中定义 Vue.mixin({ onShow() { console.log('页面显示:', this.$route.path); // 触发局逻辑,例如埋点、权限校验 uni.$emit('globalPageShow', this.$route); }, onHide() { console.log('页面隐藏:', this.$route.path); uni.$emit('globalPageHide', this.$route); } }); ``` - **优点**:精确监听每个页面的显示/隐藏。 - **缺点**:需注意混入的代码对所有页面生效,避免冲突[^4]。 --- ### 方案三:拦截路由跳转 通过封装 `uni.navigateTo` 等方法,在路由跳转前后触发局逻辑: ```javascript const originalNavigateTo = uni.navigateTo; uni.navigateTo = function(options) { console.log('监听跳转到', options.url); originalNavigateTo.call(uni, options); }; // 类似地拦截 navigateBack、switchTab 等 ``` --- ### 总结 - **精确监听页面生命周期**:使用 **局混入(方案二)**。 - **监听应用前后台状态**:使用应用级 `onShow`/`onHide`(方案一)。 - 若需区分页面层级变化,需结合 `getCurrentPages()` 获取页面栈[^1][^4]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端开发大师鸭

请作者喝杯咖啡 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值