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 相关文章推荐
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
javascript encodeURI和encodeURIComponent的比较
Apr 03 Javascript
理解Javascript闭包
Nov 01 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
Apr 18 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
Jul 04 Javascript
详解微信小程序调起键盘性能优化
Jul 24 Javascript
JavaScript实现单图片上传并预览功能
Sep 30 Javascript
基于vue中的scoped坑点解说
Sep 04 Javascript
vue里使用create, mounted调用方法
Apr 26 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
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
php array_map()函数实例用法
2021/03/03 PHP
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
jquery选择器简述
2015/08/31 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
Vue实现简单分页器
2018/12/29 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue实现选中效果
2020/10/07 Javascript
Python决策树分类算法学习
2017/12/22 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Python检查ping终端的方法
2019/01/26 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
波兰珠宝品牌:YES
2019/08/09 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
远程教育心得体会
2014/01/03 职场文书
物理课外活动总结
2014/08/27 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书