vue 监听是否切屏和开启小窗的实现过程

 更新时间:2023年04月24日 09:34:07   作者:相与还  
这篇文章主要介绍了vue 监听是否切屏和开启小窗的过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

前言

在做自己的项目的时候有用到判断设备是否有切屏,一般用的多的地方就是考试系统,切屏我们都知道,一般可以很容易的进行监控,只不过当开启了小窗的时候,之前一直没有解决办法,而现在则通过监控切屏和小窗来教大家如何进行设置监听这两种方式。

切屏监控

方法一

Vue框架提供了一个$hidden属性,可以用来判断当前页面是否被隐藏(如在后台标签页)。以下是具体代码:

export default {
  data () {
    return {
      isHidden: false // 页面是否被隐藏(初始值为false)
    };
  },
  created () {
    // 监听document visibilityState变化事件(用于监听页面是否被隐藏)
    document.addEventListener('visibilitychange', this.onVisibilityChange);
  },
  destroyed () {
    // 解除监听事件
    document.removeEventListener('visibilitychange', this.onVisibilityChange);
  },
  methods: {
    // 监听页面是否被隐藏
    onVisibilityChange () {
      this.isHidden = document.hidden;
      if (this.isHidden) { // 当前页被隐藏
        // 执行相关操作
      } else { // 当前页被打开
        // 执行相关操作
      }
    }
  }
};

以上代码在Vue组件中,利用$hidden属性来判断当前页面是否被隐藏,并根据该取值来执行相应操作。需要注意的是,在关闭组件前必须解除监听事件以避免内存泄漏。

方法二

可以利用Vue的activated和deactivated生命周期函数来实现判断页面是否因为切换而隐藏。

具体代码如下:

export default {
  data() {
    return {
      isActive: false, // 标志页面是否处于活动状态
      isHidden: false, // 标志页面是否处于隐藏状态
    };
  },
  activated() {
    this.isActive = true;
    if (this.isHidden) {
      console.log('页面由隐藏状态切换到了活动状态');
      // TODO:执行需要在页面由隐藏状态切换到活动状态时的逻辑
    }
    this.isHidden = false;
  },
  deactivated() {
    this.isActive = false;
    if (!this.isHidden) {
      console.log('页面由活动状态切换到了隐藏状态');
      // TODO:执行需要在页面由活动状态切换到隐藏状态时的逻辑
    }
    this.isHidden = true;
  },
};

在代码中,我们定义了两个变量isActive和isHidden,分别代表页面是否处于活动和隐藏状态。

当activated生命周期函数被触发时,我们将isActive设置为true,并且如果此时页面之前处于隐藏状态,则说明页面是因为切换而隐藏的,此时我们可以执行一些需要在页面由隐藏状态切换到活动状态时的逻辑。

同理,当deactivated生命周期函数被触发时,我们将isActive设置为false,并且如果此时页面之前处于活动状态,则说明页面是因为切换而隐藏的,此时我们可以执行一些需要在页面由活动状态切换到隐藏状态时的逻辑。

同时,我们还需要根据activated和deactivated生命周期函数的调用顺序来设置isHidden的值,以便准确标志页面是否处于隐藏状态。

小窗监控

方法一

一开始我是没有头绪的,但是现在实际上是可以通过监听视窗和实际窗口比较大小,如果一直说明没有变成小窗,否则说明开启了小窗,那么就可以通过监控它来添加我们需要的逻辑。

Vue 本身并没有直接提供监测设备是否开启小窗口的 API,但可以通过 JavaScript 监听 window 对象的 resize 事件变化并通过 document.documentElement.clientHeight 和 document.documentElement.clientWidth 获取当前视口宽高,进而推断出设备是否开启小窗口。

具体的实现方法如下:

在 Vue 组件中监听 resize 事件

<template>
  <div>{{ status }}</div>
</template>

<script>
export default {
  data() {
    return {
      status: ''
    };
  },
  created() {
    window.addEventListener('resize', this.check);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.check);
  },
  methods: {
    check() {
      if (document.documentElement.clientHeight < window.innerHeight) {
        this.status = '开启小窗口';
      } else {
        this.status = '非小窗口';
      }
    }
  }
};
</script>

html
<template>
  <div>{{ status }}</div>
</template>

<script>
export default {
  data() {
    return {
      status: ''
    };
  },
  created() {
    window.addEventListener('resize', this.check);
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.check);
  },
  methods: {
    check() {
      if (document.documentElement.clientHeight < window.innerHeight) {
        this.status = '开启小窗口';
      } else {
        this.status = '非小窗口';
      }
    }
  }
};
</script>

在上面的代码中,我们使用了 window 对象的 resize 事件,并在组件创建时添加该监听器。check() 方法会在触发 resize 前后检查视口大小并输出结果。

根据视口大小是否变化判断设备状态
在上述 check() 方法中,我们使用了一些计算方式来判断设备状态。主要思路是通过比较视口高度和 window 高度的大小,如果视口高度小于 window 高度,则认为设备处于小窗口模式,否则为非小窗口模式。

总之,这是一种可行的方式来检测设备是否开启小窗口,但需要注意的是,不同的设备及浏览器可能会有不同的反应速度,因此我们需要在具体情况中进行适当的测试和调整。

方法二

除了以上方法,还可以通过matchMedia进行查询
以下代码是利用媒体查询(Media Query)来判断是否开启小窗的方法,与Vue框架无关:

// 创建一个媒体查询实例
const mediaQuery = window.matchMedia('(max-width: 768px)');

// 监听媒体查询变化并执行回调函数
mediaQuery.addListener(function (mq) {
  if (mq.matches) { // 当前窗口大小满足小窗条件
    // 执行相关操作
  } else { // 当前窗口大小不满足小窗条件
    // 执行相关操作
  }
});

以上代码中,我们使用matchMedia方法来创建一个媒体查询实例,并将小窗条件作为参数传入。之后,通过addListener方法来监听该实例的变化,根据当前窗口大小是否满足小窗条件来执行相应操作。

需要注意的是,在使用该方法时,必须保证所设置的媒体查询条件与CSS样式表中所定义的一致,否则可能导致判断出错。

方法三

还可以通过操作DOM元素判断是否开启小窗,
以下代码是通过检测DOM元素宽度来判断是否开启小窗的方法:

export default {
  data () {
    return {
      isSmallScreen: false // 是否开启小窗(初始值为false)
    };
  },
  mounted () {
    // 初次加载组件时判断初始窗口大小
    this.checkWindowSize();
  },
  methods: {
    // 检查当前窗口尺寸并根据该值更新isSmallScreen变量取值
    checkWindowSize () {
      const elementWidth = document.documentElement.clientWidth;
      if (elementWidth <= 768) {
        this.isSmallScreen = true;
      } else {
        this.isSmallScreen = false;
      }
    }
  }
};

以上代码中,我们使用checkWindowSize函数来检查当前窗口宽度,并根据该值来更新isSmallScreen变量的取值。需要注意的是,在初次渲染组件时也必须执行一次checkWindowSize函数以确保页面显示正确。

该方法相对于利用媒体查询或监控屏幕大小变化的方法而言,更加精准,但不可避免地需要操作DOM,因此需要注意效率和性能问题

结语

以上就是实现vue监听切屏和开启小窗的过程

到此这篇关于vue 监听是否切屏和开启小窗的实现过程的文章就介绍到这了,更多相关vue 监听切屏和开启小窗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue可视化大屏实现无线滚动列表飞入效果

    vue可视化大屏实现无线滚动列表飞入效果

    本文主要介绍了vue可视化大屏实现无线滚动列表飞入效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • vue2滚动条加载更多数据实现代码

    vue2滚动条加载更多数据实现代码

    本篇文章主要介绍了vue2滚动条加载更多数据实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Vue中$nextTick实现源码解析

    Vue中$nextTick实现源码解析

    这篇文章主要为大家介绍了Vue中$nextTick实现源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • vue-echarts如何实现图表组件封装详解

    vue-echarts如何实现图表组件封装详解

    由于在项目中需要对数据进行可视化处理,也就是用图表展示,所以下面这篇文章主要给大家介绍了关于vue-echarts如何实现图表组件封装的相关资料,需要的朋友可以参考下
    2022-05-05
  • Vue代码整洁之去重方法整理

    Vue代码整洁之去重方法整理

    在本篇文章里小编给大家整理的是关于Vue代码整洁之去重的相关知识点内容,需要的朋友们学习下。
    2019-08-08
  • element-ui中导航组件menu的一个属性:default-active说明

    element-ui中导航组件menu的一个属性:default-active说明

    这篇文章主要介绍了element-ui中导航组件menu的一个属性:default-active说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue 录制视频并压缩视频文件的方法

    vue 录制视频并压缩视频文件的方法

    这篇文章主要介绍了vue 录制视频并压缩视频文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • vue-cli使用stimulsoft.reports.js的详细教程

    vue-cli使用stimulsoft.reports.js的详细教程

    Stimulsoft Reports.JS是一个使用JavaScript和HTML5生成报表的平台。它拥有所有拥来设计,编辑和查看报表的必需组件。该报表工具根据开发人员数量授权而不是根据应用程序的用户数量。接下来通过本文给大家介绍vue-cli使用stimulsoft.reports.js的方法,一起看看吧
    2021-12-12
  • 一文详解vue-router中的导航守卫

    一文详解vue-router中的导航守卫

    vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航,在 vue-router 中,导航守卫是一种非常重要的功能,所以本文将详细讲解一下vue-router中的导航守卫,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • Vue中获取this.$refs为undefined的问题

    Vue中获取this.$refs为undefined的问题

    这篇文章主要介绍了Vue中获取this.$refs为undefined的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论