项目优化之监听tab切出事件

【场景进入】

项目中有页面用到了自动订阅数据
有天我回家时忘了关闭该页面,页面整晚一直在订阅和推送数据,最终导致后台出现了问题,好像订阅数据太多导致nats服务起不来了,我的前端页面也出现了报错。。。
在这里插入图片描述
,于是我就准备来进行优化一下

【搞活思路】

首先的思路是当用户切出页面时就自动取消订阅,重新进入时又自动开始订阅,为了保持数据准确,每次进入时又自动刷新一下,重新获取最新数据后再开始订阅

首先想到的是useEffect中的return,但这玩意是在组件卸载的时候才会触发,当用户切换tab页的时候是不会触发的。。。

在网上查找了资料发现可以通过浏览器监听的visibilitychange事件来解决
https://juejin.cn/post/6844903962403946503
也就是浏览器里在当前标签页切换时,会触发 visibilitychange 事件

【浅开一下】

以下是我结合项目的使用,着急的小伙伴可直接跳步到【收】收看😄

【开】

在这里插入图片描述

useEffect(() => {
	//监听当页面tab是否被切出
	window.addEventListener('visibilitychange', (e) => {
		console.log('页面是否切出', document.hidden);
		if (!document.hidden) {
			//重新获取一下数据
			(async () => {
				await fetchData({
					page: 1,
					per_page: PAGE_SIZE,
					search: search || undefined,
					sorted_by: 'desc',
				});
			})();
			//开始订阅可以在这里处理,但我写到后面了,效果是一样的哈
		}
	});
	
	return () => {
		//卸载组件时记得移除事件监听哦
		window.removeEventListener('visibilitychange', (e) => 		{});
		};
}, []);

在这里插入图片描述

useEffect(() => {
    if (!document.hidden) {
        //订阅,其实这里可以和上一步合并起来,但由于我的订阅需要其他的判断,综合考虑还是分开来写了,小伙伴们可以不用管
    } else{
        //取消订阅
    }
}, [document.hidden]);

也算是为后台小哥做出了一点点🤏贡献啦,哈哈
在这里插入图片描述

【收】
其实总结起来就几行代码

useEffect(() => {
    window.addEventListener('visibilitychange', (e) => {
        if (!document.hidden) {
            //进入页面
            //订阅
        } else{
            //取消订阅
        }
    })

	return () => {
		//卸载组件时记得移除事件监听哦
		window.removeEventListener('visibilitychange', (e) => 		{});
	};
}, []);

【参】
https://juejin.cn/post/6844903962403946503

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值