记一种uniapp h5端阻止回退的方法

        最近使用uniapp开发一个h5端的应用,由于首次使用,着实踩了不少坑,阻止用户回退就是其中的一个。

        先上结论:只要在不希望被回退到的页面里(例如登录页)在跳转之前使用history.replaceState方法把这一页的history的地址替换成跳转后的页面地址,就不会再回退到这一页了,因为历史页面地址变成了跳转后页面地址。

        这个需求比较常见,比如:用户从登录页面登录成功后不希望用户能够回退到登录页,用户支付成功后不希望用户回退到支付页。以前做电脑端的项目还不怎么注意这些,毕竟很少会用到浏览器的回退键。但是在手机上用户会频繁的使用回退,比如从微信公众号内点击模板消息进入网页应用后,虽然页面左上角会有×按钮直接关闭,但是很多人单手握持手机时可能更习惯使用手机回退键或者全面屏手势侧滑回退(相当于手机回退键),直至退出网页应用,这就导致可能会回退到登录页或者其他不太想让用户回退的页面。

        最开始解决这个问题时,首先想到的是监听返回事件,uniapp有onBackPress方法:

但是后来发现h5端无法只支持顶部导航栏按钮的监听,手机和浏览器的回退并不支持。

经过多方查阅后,发现可以监听popstate事件:

onShow() {
    var state = { 
		title: "title", 
		url: "#"
    }; 
	history.pushState(state, "title", document.URL);
	window.addEventListener('popstate', this.handleback);
},
onUnload(){
	setTimeout(() => {  
		   window.removeEventListener('popstate', this.handleback);
	},300)  
},
onHide() {
	window.removeEventListener('popstate', this.handleback);
},
methods: {
	handleback(){
		var vm = this;
		var myback = function(){
		    var state = {
				title: "title", 
				url: "#"
			}; 
			history.pushState(state, "title", document.URL);
		}.bind(vm)	
		uni.showModal({
			title: '已经在首页了!',
			showCancel:false,
			success: myback
		})
	}
}

但是在使用后发现:虽然在控制台使用history.go(-1)这样的方式可以触发事件,但是使用浏览器回退键以及手机的回退键某些时候并不会触发事件,用起来体验不是很好。

在监听回退事件这里纠结了很久以后,突然想到history除了有pushState方法,还有个replaceState方法,那么我只要在不希望被回退的页面里把history信息替换成首页不就不会再回退回来了吗?于是我在登录页登录成功跳转语句之前加入

window.history.replaceState(null,null,'/')

然后再跳转到首页,这样再回退就不会回到登录页了,支付页同理。

至此,问题解决!

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
uni-app中,可以通过uni-app的生命周期函数和路由拦截来实现小程序登录拦截。 首先,在App.vue或者main.js中的App实例中监听uni-app的生命周期函数onLaunch,这个函数会在小程序初始化完成时触发。在该函数中,你可以进行登录状态的判断和处理。 以下是一个示例代码: ```javascript // main.js import Vue from 'vue' import App from './App' Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ ...App }) app.$mount() // App.vue export default { onLaunch(options) { // 判断用户是否登录 const isLogin = uni.getStorageSync('isLogin') if (!isLogin) { // 未登录,跳转到登录页面 uni.redirectTo({ url: '/pages/login/login' }) } } } ``` 在上述示例代码中,我们使用了uni.getStorageSync来判断用户是否登录,你可以根据自己的业务逻辑进行判断。如果用户未登录,则使用uni.redirectTo方法跳转到登录页面。 此外,还可以通过路由拦截的方式实现小程序登录拦截。在uni-app中,可以使用uni.beforeEach全局路由守卫来进行拦截。 以下是一个示例代码: ```javascript // main.js import Vue from 'vue' import App from './App' Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ ...App }) app.$mount() // router.js import Vue from 'vue' import Router from 'uni-simple-router' Vue.use(Router) const router = new Router({ routes: [ // 路由配置 ] }) // 全局路由前置守卫 router.beforeEach((to, from, next) => { if (to.path !== '/login' && !uni.getStorageSync('isLogin')) { // 未登录,跳转到登录页面 next({ path: '/login' }) } else { next() } }) export default router ``` 在上述示例代码中,我们使用了全局路由前置守卫router.beforeEach来进行登录拦截。如果用户未登录并且不是跳转到登录页面,则使用next方法进行路由重定向到登录页面。 通过以上两种方式,你可以在uni-app中实现小程序的登录拦截。根据你的具体需求和项目架构,选择适合你的方式来实现即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nwsxdxqs

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值