VUE实时监听元素距离顶部高度的操作


Posted in Javascript onJuly 29, 2020

效果图如下所示

VUE实时监听元素距离顶部高度的操作

.html

<!-- 监听ref距离顶部高度 -->
<div ref="pronbit">
 <div>今日热门</div>
 <div>今日热销</div>
</div>

.js

mounted(){
 window.addEventListener('scroll',this.handleScrollx,true)
},
methods: {
 handleScrollx() {
  console.log('滚动高度',window.pageYOffset)
  console.log('距离顶部高度',this.$refs.pronbit.getBoundingClientRect().top)
 },
}

补充知识:Vue异步更新队列 及 $nextTick的使用

问题一:什么是$nextTick?

简单回答:

因为Vue的异步更新队列,$nextTick是用来知道什么时候DOM更新完成的。

详细解读:

我们先来看这样一个场景:有一个div,默认用 v-if 将它隐藏,点击一个按钮后,改变 v-if 的值,让它显示出来,同时拿到这个div的文本内容。如果v-if的值是 false,直接去获取div内容是获取不到的,因为此时div还没有被创建出来,那么应该在点击按钮后,改变v-if的值为 true,div才会被创建,此时再去获取,示例代码如下:

<div id="app">
    <div id="div" v-if="showDiv">这是一段文本</div>
    <button @click="getText">获取div内容</button>
  </div>
  <script>
  var app = new Vue({
    el : "#app",
    data:{
      showDiv : false
    },
    methods:{
      getText:function(){
        this.showDiv = true;
        var text = document.getElementById('div').innnerHTML;
         console.log(text);
      }
    }
  })
  </script>

这段代码并不难理解,但是运行后在控制台会抛出一个错误:Cannot read property 'innnerHTML of null,意思就是获取不到div元素。这里就涉及Vue一个重要的概念:异步更新队列。

异步更新队列

Vue在观察到数据变化时并不是直接更新DOM,而是开启一个队列,并缓冲在同一个事件循环中发生的所有数据改变。在缓冲时会去除重复数据,从而避免不必要的计算和DOM操作。然后,在下一个事件循环tick中,Vue刷新队列并执行实际(已去重的)工作。所以如果你用一个for循环来动态改变数据100次,其实它只会应用最后一次改变,如果没有这种机制,DOM就要重绘100次,这固然是一个很大的开销。

Vue会根据当前浏览器环境优先使用原生的Promise.then和MutationObserver,如果都不支持,就会采用setTimeout代替。

知道了Vue异步更新DOM的原理,上面示例的报错也就不难理解了。事实上,在执行this.showDiv = true时,div仍然还是没有被创建出来,直到下一个vue事件循环时,才开始创建。$nextTick就是用来知道什么时候DOM更新完成的,所以上面的示例代码需要修改为:

<div id="app">
    <div id="div" v-if="showDiv">这是一段文本</div>
    <button @click="getText">获取div内容</button>
  </div>
  <script>
  var app = new Vue({
    el : "#app",
    data:{
      showDiv : false
    },
    methods:{
      getText:function(){
        this.showDiv = true;
        this.$nextTick(function(){
           var text = document.getElementById('div').innnerHTML;
           console.log(text); 
        });
      }
    }
  })
  </script>

这时再点击事件,控制台就打印出div的内容“这是一段文本“了。

理论上,我们应该不用去主动操作DOM,因为Vue的核心思想就是数据驱动DOM,但在很多业务里,我们避免不了会使用一些第三方库,比如 popper.js、swiper等,这些基于原生javascript的库都有创建和更新及销毁的完整生命周期,与Vue配合使用时,就要利用好$nextTick。

以上这篇VUE实时监听元素距离顶部高度的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
JS提交form表单实例分析
Dec 10 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
浅谈JavaScript中变量和函数声明的提升
Aug 09 Javascript
node.js中实现kindEditor图片上传功能的方法教程
Apr 26 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
Jul 24 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
Dec 11 Javascript
vue的全局变量和全局拦截请求器的示例代码
Sep 13 Javascript
webgl实现物体描边效果的方法介绍
Nov 27 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
详解Vue2的diff算法
Jan 06 Vue.js
详解JavaScript作用域 闭包
Jul 29 #Javascript
Angular+ionic实现折叠展开效果的示例代码
Jul 29 #Javascript
Vue 监听元素前后变化值实例
Jul 29 #Javascript
使用eslint和githooks统一前端风格的技巧
Jul 29 #Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
Jul 29 #Javascript
小程序实现列表展开收起效果
Jul 29 #Javascript
jquery实现简单自动轮播图效果
Jul 29 #jQuery
You might like
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
JS与C#编码解码
2013/12/03 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
基于python实现微信模板消息
2015/12/21 Python
Python下载指定页面上图片的方法
2016/05/12 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
python 二维数组90度旋转的方法
2019/01/28 Python
简单了解django索引的相关知识
2019/07/17 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python实现人机五子棋
2020/03/25 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python如何构建mock接口服务
2021/01/28 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
志愿者活动总结报告
2014/06/27 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
在人间读书笔记
2015/06/30 职场文书
创业计划书之外语培训班
2019/11/02 职场文书