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 相关文章推荐
用tip解决Ext列宽度不够的问题
Dec 13 Javascript
javascript循环变量注册dom事件 之强大的闭包
Sep 08 Javascript
页面载入结束自动调用js函数示例
Sep 23 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
基于jQuery实现表单提交验证
Nov 24 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
在JavaScript中正确引用bind方法的应用
May 11 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 Javascript
详解关于vue2.0工程发布上线操作步骤
Sep 27 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
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
es6数值的扩展方法
2019/03/11 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
实例说明Python中比较运算符的使用
2015/05/13 Python
深入理解Python对Json的解析
2017/02/14 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
户外婚礼策划方案
2014/02/08 职场文书
校园安全广播稿
2014/02/08 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
公司股份合作协议书
2014/12/07 职场文书
水电工程师岗位职责
2015/02/13 职场文书
培训通知书模板
2015/04/17 职场文书
MySQL查询日期时间
2022/05/15 MySQL