解决Vue中mounted钩子函数获取节点高度出错问题


Posted in Javascript onMay 18, 2018

遇到的问题

最近在开发一个Vue的项目,好几个页面都有用到一个 页面楼层滑动的组件,我就直接封装成了一个,但是遇到一个bug,就是我需要得到这个组件的offsetTop,然后页面滚动到这个位置的时候,就设置position属性为fixed,让他固定在屏幕上。问题是当我在mounted钩子函数中获取offsetTop的时候,在新开的页签中打开页面,会得到错误的offsetTop,但是在当前页面刷新,就不会有问题。

定位问题

后来查到问题,就是加载的问题,新窗口打开图片,默认是没有带缓存的,图片是GET请求,是异步的,js运行的肯定比图片GET要快,所以当执行mounted钩子函数的时候,图片还没有全部加载完,这时候就会得到一个错误的offsetTop。

解决方案

给图片加上ref属性,并在那个组件里的mounted钩子函数中写,

this.$refs.img.onload = ()=>{
Bus.$emit('loadImgSuccess')
}

这里的Bus是用的EventBus,两个组件中事件响应的办法,不懂或者感兴趣的可以点这里EventBus。
需要得到offsetTop的组件里面

Bus.$on('loadImgSuccess', () => {
var offsetTop = this.$refs.dom.offsetTop 
})

这时候就可以确认每次不管是页面新打开还是当前页刷新都可以得到正确的offsetTop。

Javascript 相关文章推荐
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
Mar 10 Javascript
js获取元素相对窗口位置的实现代码
Sep 28 Javascript
javascript中var的重要性分析
Feb 11 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
javascript的document中的动态添加标签实现方法
Oct 24 Javascript
vue父组件通过props如何向子组件传递方法详解
Aug 16 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
浅谈angular.copy() 深拷贝
Sep 14 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 Javascript
JavaScript嵌入百度地图API的最详细方法
Apr 16 Javascript
Vue数据双向绑定原理及简单实现方法
May 18 #Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
May 17 #Javascript
Vue中对比scoped css和css module的区别
May 17 #Javascript
vue引用js文件的多种方式(推荐)
May 17 #Javascript
vue router+vuex实现首页登录验证判断逻辑
May 17 #Javascript
浅谈webpack-dev-server的配置和使用
May 17 #Javascript
Node.js模块全局安装路径配置方法
May 17 #Javascript
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP编码规范-php coding standard
2007/03/16 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
Python中函数的返回值示例浅析
2019/08/28 Python
python 实现按对象传值
2019/12/26 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
Python实现代码块儿折叠
2020/04/15 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
中专毕业生自荐信
2013/11/16 职场文书
快递业务员岗位职责
2014/01/06 职场文书
幼师大班个人总结
2015/02/13 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸