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中数组中求最大值示例代码
Dec 18 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
javascript删除数组元素并且数组长度减小的简单实例
Feb 14 Javascript
Javascript基础教程之函数对象和属性
Jan 18 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 Javascript
纯javascript版日历控件
Nov 24 Javascript
JavaScript Date 知识浅析
Jan 29 Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
May 12 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 Javascript
vue实现可以快进后退的跑马灯组件
Apr 08 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实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
php发送post请求函数分享
2014/03/06 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
php微信开发接入
2016/08/27 PHP
java script编程起步(第三课)
2007/01/10 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
JavaScript用select实现日期控件
2015/07/17 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
python删除字符串中指定字符的方法
2018/08/13 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python之mock模块基本使用方法详解
2019/06/27 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
中专毕业生自我鉴定范文
2013/11/09 职场文书
一岗双责责任书
2014/04/15 职场文书
公司担保书格式范文
2014/05/12 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
单独二胎证明
2015/06/24 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
Golang 并发编程 SingleFlight模式
2022/04/26 Golang