uniapp的app项目,某个页面长时间无操作,返回首页

最开始想做成一个公共的,完全提取出来的一个组件,组件设置背景透明,到时候哪个页面需要,直接引入组件就可以了,所以最开始做的是一个vue的组件,在组件中,监听页面的@touchstart,但是这个组件会盖住原来页面的一些操作,导致原来页面的操作无法进行,所以最后只是把公共的方法提取出来做了mixins,然后在原来的页面加了@touchstart.capture,为啥要capture,下面会具体描述。

mixins代码:

复制代码
import {timeOutToHome} from "@/static/constant/patient.js"
import {pageReLauncho } from '@/utils/common';
	
export default {
  data() {
    return {
      idleTimer: null, // 定时器
    };
  },
  methods: {
    // 启动定时器
    startIdleTimer() {
      this.idleTimer = setTimeout(() => {
				// 检查当前页面是否仍然活跃:因为刚开始,是dragPatient中的click先触发,然后页面的click再触发,导致先跳转页面,才执行重置定时器,跳转页面后,有执行定时器跳到首页了,现在在页面外层的click增加了click.capture,就是先执行外层click-重置定时其,在执行dragPatient的click,就不会有问题
				// const pages = getCurrentPages();
				// const currentPage = pages[pages.length - 1];
				// console.log('-----current', currentPage.route)
				// if (currentPage.route !== "pages/patient/patient") {
				// 	this.clear() // 如果已经不是当前页面,清理定时器
				// 	return;
				// }
							
				console.log('----当前播放状态', this.playStatus)
				if(!this.playStatus){
					console.log("页面长时间无操作,执行特定事件");
					this.onIdle();
				}
      }, timeOutToHome);
    },
    // 重置定时器
    resetIdleTimer() {
	console.log('---重置定时器')
      this.clear()
      this.startIdleTimer();
    },
    // 页面无操作时执行的事件
    onIdle() {
      // 在这里执行你想要的操作:例如:弹出提示框、跳转页面等
      console.log("用户长时间没有操作页面");
			pageReLauncho("index/home")
    },
    // 监听用户操作
    handleUserActivity() {
      this.resetIdleTimer();
    },
    clear(){
		clearTimeout(this.idleTimer);
		this.idleTimer = null
	}
  },
  onShow() {
	// 页面加载时启动定时器
	this.startIdleTimer();
  },
  onHide() {
	console.log('---clear timeout')
	 this.clear()
  },
  onUnload() {
	console.log('---clear timeout')
	 this.clear()
  }
};

主页面代码:

复制代码
<template>
  <view class="patient-home-container" @touchstart.capture="handleUserActivity">

注意点分析:

1、测试的时候,页面有个侧边导航,点击跳转其他页面,但是跳到其他页面过了一段时间,又跳到首页了,检查后发现,原来侧边导航的点击在页面点击之前执行了,导致即使跳转页面,还会执行每隔一段时间跳转首页,加上capture后,就会先执行页面的操作,在执行页面内按钮的操作,具体如下图

2、之前把touchStart放在了组件中,但是会导致页面的click失效,所以放回了页面中。

3、这里面mixins多了一个操作,判断视频是否播放,因为需求:如果视频正在播放不允许返回首页,所以在mixins中判断了当前视频播放的状态,这个状态在页面中通过播放、暂停等事件控制,主要代码如下:

复制代码
 <video 
	ref="myVideoRef"
	class="video-player" 
	:src="currentVideo" 
	:poster="currentPoster"
	@play="onPlay"
	@pause="onPause"
	@ended="onEnded"
	controls>
</video>


onPlay(e) {
    console.log('视频开始播放', e);
	this.playStatus = true;
},
onPause(e) {
	console.log('视频暂停', e);
	this.playStatus = false;
	this.resetIdleTimer()
},
onEnded(e) {
	console.log('视频播放结束', e);
	this.playStatus = false;
	this.resetIdleTimer()
},
相关推荐
weixin_382395239 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__9 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.10 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~11 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华12 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子14 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅14 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni14 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学16 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端