vueJs实现DOM加载完之后自动下拉到底部的实例代码


Posted in Javascript onAugust 31, 2018

这篇文章给大家介绍vueJs实现DOM加载完成之后自动下拉到底部,文中给大家记录了整个问题的过程,对实现思路感兴趣的朋友大家阅读下本文。

/.....................................更新..................................../

这个问题是很早之前遇到的,后来想来,其实是个很简单的问题。在dom记载完成就自动下拉到底部,只需要使用Vue.nextTick(() => {})函数即可,因为vue是虚拟dom,不会实时更新dom,nectTick()就是注册在下一次更新dom之后的回调。

而再看我的问题,其实之所以出现那样的问题,就是ajax的异步执行的问题而已。

/..................................................更新完..................../

工作项目是基于vueJs框架的,遇到一个需求:有一组件,在创建时会通过ajax向服务器请求一组数据,以列表形式展示出来,并且自动下拉到底部。

实现思路:首先弄清楚vueJs组件的生命周期,如下图。发完发现图不见了...这里貌似不能放图,就是vueJs生命周期和钩子,读者自行百度一下吧,到处都是。

具体细节不做介绍,自行看图或者右转官网查找http://cn.vuejs.org/

知道了生命周期,再对应需求,很自然地关注三个时期beforeCreate,mounted,updated.

1. beforeCreate时期

此时期相当于做一些初始化工作,此时做ajax最合适。代码如下:

beforeRouteEnter(to, from, next) {
 next(function(vm) {
 if (vm.dataList.length == 0) {
  //此处实现ajax
  vm.getVersionInfo();
 }
 });
}

代码是之前写的,使用的beforeRouteEnter钩子(vm:因为此时该组件可能还未创建,所以不能用this,而用vm代替,vm所执行代码会在其创建之后执行。),这个钩子会在每次通过vue-route路由进入组件页面前调用,而需求是只有第一次进入需要自动执行ajax,因此还做了判断data是否长度为0,而在写博的时候发现,如果使用beforeCreate钩子应该就不会有这么多麻烦,不过也仅仅是猜测,使用请自行验证。

2. mounted时期

此钩子会在模板(html)编译完成并挂载后调用,最开始我想的是,在这里实现一个自动滚动到底部的操作,但是发现不行。为什么呢?因为ajax是异步操作,在beforeCreate时期执行了ajax,并不能保证在mounted时,数据已经传回,所以此时做下拉操作没有意义。

3 updated时期

此钩子在组件对象data数据发生变化时,而我在ajax的success回调函数里会改变data,所以此时调用应该是很合适的。然而,实现之后又出现了问题,每次自动下拉滚动到底部只能下拉滚动到data原列表的最底部,而新添加的项还在下面。举例来说

4(ajax新获取)

每次updated处执行ajax下拉操作自动下拉滚动,只能会到4,而不是5的位置。究其原因,原来是因为updated是执行时,打他只是data改变,而有可能document并没有渲染完成,从而导致,不能处理新添加的项,而偏偏vue并没有提供渲染完成的钩子。

在网上锁了搜了很多资料,一些资料,比较靠谱的是设置一个延迟,setTimeout(),但是这样页面会有明显的一个跳动柑橘感觉闪动,影响用户体验,而我的处理是:

updated() {
 let count = 0;
 let interval = setInterval(() => {
  if (count > 3000) {
  clearInterval(interval);
  this.isFirst = false;
  }
  count++;
  if (document.body.scrollHeight != document.body.clientHeight) {
  document.body.scrollTop = document.body.scrollHeight;
  if (document.body.scrollTop == document.body.scrollHeight-document.body.clientHeight) {
   clearInterval(interval);
   this.isFirst = false;
  }
  }
 }, 0);
}

这个原理应该很简单,看代码应该能看明白。

总结

以上所述是小编给大家介绍的vueJs实现DOM加载完之后自动下拉到底部的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
超级退弹代码
Jul 07 Javascript
模仿JQuery sortable效果 代码有错但值得看看
Nov 05 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
js判断页面中是否有指定控件的简单实例
Mar 04 Javascript
JavaScript极简入门教程(二):对象和函数
Oct 25 Javascript
Javascript基础教程之变量
Jan 18 Javascript
自己动手写的jquery分页控件(非常简单实用)
Oct 28 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
js实现数字递增特效【仿支付宝我的财富】
May 05 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
记录微信小程序 height: calc(xx - xx);无效问题
Dec 30 Javascript
Postman环境变量全局变量使用方法详解
Aug 13 Javascript
Angular2中监听数据更新的方法
Aug 31 #Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 #Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 #Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 #Javascript
Vue.directive使用注意(小结)
Aug 31 #Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 #Javascript
vue 项目中使用Loading组件的示例代码
Aug 31 #Javascript
You might like
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
咖啡与牛奶
2021/03/03 冲泡冲煮
剖析 PHP 中的输出缓冲
2006/12/21 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
3种vue路由传参的基本模式
2018/02/22 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
python 合并文件的具体实例
2013/08/08 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
python实现报表自动化详解
2017/11/16 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
2020/05/11 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
乡镇群众路线专项整治方案
2014/11/03 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript
MySQL分区表管理命令汇总
2022/03/21 MySQL