遇到的问题
最近在开发一个Vue的项目,好几个页面都有用到一个 页面楼层滑动的组件,我就直接封装成了一个,可是遇到一个bug,就是我须要获得这个组件的offsetTop,而后页面滚动到这个位置的时候,就设置position属性为fixed,让他固定在屏幕上。问题是当我在mounted钩子函数中获取offsetTop的时候,在新开的页签中打开页面,会获得错误的offsetTop,可是在当前页面刷新,就不会有问题。segmentfault
后来查到问题,就是加载的问题,新窗口打开图片,默认是没有带缓存的,图片是GET请求,是异步的,js运行的确定比图片GET要快,因此当执行mounted钩子函数的时候,图片尚未所有加载完,这时候就会获得一个错误的offsetTop。缓存
给图片加上ref属性,并在那个组件里的mounted钩子函数中写,dom
this.$refs.img.onload = ()=>{ Bus.$emit('loadImgSuccess') }
这里的Bus是用的EventBus,两个组件中事件响应的办法,不懂或者感兴趣的能够点这里EventBus。
须要获得offsetTop的组件里面异步
Bus.$on('loadImgSuccess', () => { var offsetTop = this.$refs.dom.offsetTop })
这时候就能够确认每次无论是页面新打开仍是当前页刷新均可以获得正确的offsetTop。函数