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 相关文章推荐
JavaScript 常用函数库详解
Oct 21 Javascript
JS 实现Json查询的方法实例
Apr 12 Javascript
JS循环遍历JSON数据的方法
Jul 08 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
Oct 10 Javascript
a标签的href与onclick事件的区别详解
Nov 12 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
Feb 10 Javascript
安装vue-cli报错 -4058 的解决方法
Oct 19 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
小程序实现tab标签页
Nov 16 Javascript
详解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
Apache2 httpd.conf 中文版
2006/12/06 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
checkbox使用示例
2013/08/23 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
canvas的神奇用法
2017/02/03 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
大二自我鉴定
2014/01/31 职场文书
关于青春的演讲稿
2014/05/05 职场文书
介绍长城的导游词
2015/01/30 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
导游词之无锡古运河
2019/11/14 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS