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 相关文章推荐
基于jQuery的图片剪切插件
Aug 03 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
May 20 Javascript
javascript获取作用在元素上面的样式属性代码
Sep 20 Javascript
JavaScript将取代AppleScript?
Sep 18 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
Aug 02 Javascript
微信开发 微信授权详解
Oct 21 Javascript
jQuery Position方法使用和兼容性
Aug 23 jQuery
vue debug 二种方法
Sep 16 Javascript
Vue组件通信的几种实现方法
Apr 25 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 Javascript
jquery插件实现轮播图效果
Oct 19 jQuery
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 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英文字母大小写转换函数小结
2014/05/03 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
js的event详解。
2006/09/06 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
javascript连续赋值问题
2015/07/08 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
python计算N天之后日期的方法
2015/03/31 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python List cmp()知识点总结
2019/02/18 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
优秀护士演讲稿
2014/04/30 职场文书
活动总结的格式
2014/05/07 职场文书
爱护花草树木的标语
2014/06/11 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
创先争优承诺书
2015/01/20 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
勇敢的心观后感
2015/06/09 职场文书
OpenCV实现普通阈值
2021/11/17 Java/Android
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle