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+jquery等)
Mar 24 Javascript
JavaScript控制table某列不显示的方法
Mar 16 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
jQuery+HTML5加入购物车代码分享
Oct 29 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
AngularJS基础 ng-selected 指令简单示例
Aug 03 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
Angular2中如何使用ngx-translate进行国际化
May 21 Javascript
vue之数据交互实例代码
Jun 16 Javascript
javascript计算对象长度的方法
Oct 25 Javascript
vue遍历生成的输入框 绑定及修改值示例
Oct 30 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 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
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
PHP多文件上传类实例
2015/03/07 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
Python使用剪切板的方法
2017/06/06 Python
Python3.4解释器用法简单示例
2019/03/22 Python
python多进程读图提取特征存npy
2019/05/21 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
关于孝道的演讲稿
2014/05/21 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
80后婚前协议书范本
2014/10/24 职场文书
武侯祠导游词
2015/02/04 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
学术会议领导致辞
2015/07/29 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL