uniapp 如何修改 返回按钮(左上角+物理按钮+侧滑)触发的返回事件

背景:

使用uniapp 开发安卓app,在用户编辑后直接返回时,使用弹窗提醒用户:还没有保存,是否保存?

方案

1. 使用自定义返回事件

//返回
back() {
// 业务逻辑,弹窗提醒
uni.showModal({
	title: '内容尚未保存,是否保存?',
	success: function (res) {
		if (res.confirm) {
			saveFun()
		} else if (res.cancel) {
			console.log('用户点击取消');
			// 然后返回
			uni.navigateBack()
		}
	}
})

},

结果:点击自定义的按钮没有问题,但是使用原生按钮返回或者是侧滑返回依旧不执行自定义逻辑

2. 使用onBackPress生命周期函数

onBackPress((option) =>{
	if(option.from === 'backbutton'){
		uni.showModal({
			title: '内容尚未保存,是否保存?',
			success: function (res) {
				if (res.confirm) {
					saveFun()
				} else if (res.cancel) {
					console.log('用户点击取消');
					// 然后返回
					uni.navigateBack()
				}
			}
		})
	
	}
	return true;
})

结果:虽然会提醒,但是无法阻止返回事件,在用户还没有点击保存的时候,它就已经返回到上一个页面了,这个也不行

3. 我测试成功的方案:使用uni拦截器

  • 添加拦截器
onShow(() =>{
	const {diaryContext,setDiaryContext} = useEditStore();
	setDiaryContext(diaryRef.value)
	uni.addInterceptor('navigateBack', {
	invoke(args) {
			// 判断是不是返回按钮触发的返回事件
		  if(args?.from === 'backbutton'){
		  		// 必须使用状态管理获取组件实例,拦截器中不能直接拿到组件的实例
			  backFun(diaryContext);
			  return false; // 阻止返回
		  }else{
			  return true; // 允许返回
		  }
	}
	})
})
  • 卸载拦截器,拦截器需要记得卸载
onHide(() =>{
	uni.removeInterceptor('navigateBack')
})

结果:使用拦截器就可以将原生返回事件进行自定义修改,包括静止原生返回事件
ps: 仅仅在安卓app 中测试有效,其他的没有测试

### 实现 UniApp 页面返回触发特定事件UniApp 中,可以通过多种方式实现在页面返回触发特定事件的功能。以下是几种常见且有效的方法: #### 方法一:使用 `onBackPress` API 监听返回操作 对于需要监听并处理返回按键的情况,可以利用 `onBackPress` 这个生命周期函数[^2]。 ```javascript export default { methods: { handleBackPress() { console.log('返回键被按下'); // 执行一些逻辑代码... // 如果已经处理了返回,则返回 true 阻止默认行为;否则返回 false 继续默认行为 return true; } }, onBackPress(options) { this.handleBackPress(); } } ``` 此方法适用于 Android 设备上的物理返回键以及 iOS 和 H5 平台下的虚拟返回按钮。 #### 方法二:监听页面卸载 (`beforeDestroy`) 来间接响应返回动作 如果希望捕捉到用户通过手势或其他方式离开当前页的行为,可以在组件即将销毁之前做相应处理[^3]。 ```javascript export default { data() { return { goback: false, }; }, beforeDestroy() { if (!this.goback) { let pages = getCurrentPages(); // 假设要通知上一页刷新数据 pages[pages.length - 2].$vm.getInfo && pages[pages.length - 2].$vm.getInfo(); } }, }; ``` 这种方法特别适合于那些即使不是由标准的“返回按钮引起的退出场景(如滑动手势),也能确保某些清理工作被执行。 #### 方法三:结合 `navigateBack` 接口主动调用回调 当从子页面返回至父页面时,还可以借助 `uni.navigateBack()` 的成功回调机制来同步状态或传递参数给上级页面[^4]。 ```javascript // 子页面内执行如下代码片段 uni.navigateBack({ delta: 1, success() { const pages = getCurrentPages(); const prevPageInstance = pages[pages.length - 1]; // 更新父级实例中的属性值或者其他交互逻辑 prevPageInstance.$vm.someMethodToCall || (() => {}); } }); ``` 这种方式非常适合用于父子页面间的数据共享和通信需求。 综上所述,开发者可以根据实际应用场景灵活选用上述任一种方案或者组合起来满足更复杂的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值