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 技巧
Apr 25 Javascript
javascript对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
js实现鼠标滑过文字链接色彩变化的效果
May 06 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
javascript基础语法——全面理解变量和标识符
Jun 02 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
Javascript动画效果(2)
Oct 11 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP Primary script unknown 解决方法总结
2019/08/22 PHP
js+xml生成级联下拉框代码
2012/07/24 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
python实现将英文单词表示的数字转换成阿拉伯数字的方法
2015/07/02 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
使用Python读取大文件的方法
2018/02/11 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
django ajax json的实例代码
2018/05/29 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
大二学期个人自我评价
2014/01/13 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
2014年质检员工作总结
2014/11/18 职场文书
2015年化工厂工作总结
2015/05/04 职场文书
麦田里的守望者读书笔记
2015/06/30 职场文书
python实现自定义日志的具体方法
2021/05/28 Python