瀑布流布局已然完成,那么剩下的就是另一个比较大的工程了——无限加载。

之前说了,这个活动项目是基于SUI-Mobile搭建的,所以可以直接使用sui内建组件“无限加载”来实现这个功能。

没有真实的数据,所有数据都是自己创建的假数据

以works.json为例:

  1. [
  2. {
  3. "id": 1,
  4. "src": "http://cued.xunlei.com/demos/publ/img/P_000.jpg",
  5. "numbering":"00001",
  6. "school":"双语小学",
  7. "student":"王伟",
  8. "praise":"23",
  9. "isDel": true,
  10. "delDesc": "图片不符合法律要求",
  11. "name": "美美的一天",
  12. "todayClk": false,
  13. "isPraise": false
  14. },
  15. ...
  16. ]

一个数组,里面是一个个的对象。

最开始实现的时候,是在methods对象里面定义一个初始化请求函数,一个分页请求函数

  1. fetchData(fn){
  2. var _this = this;
  3. axios.get("./src/assets/data/worksRank.json").then(function (res) {
  4. _this.worksList=res.data
  5. if (typeof fn =="function") fn();
  6. })
  7. },
  8. loadingMore(){
  9. var _this = this;
  10. var loading = false;
  11.  
  12. // 每次加载添加多少条目
  13. var itemsPerLoad = 10,
  14. page = 2;
  15. // 注册'infinite'事件处理函数
  16. $(document).on('infinite', function() {
  17.  
  18. // 如果正在加载,则退出
  19. if (loading) return;
  20.  
  21. // 设置flag
  22. loading = true;
  23.  
  24. // 模拟1s的加载过程,实际项需要调用ajax向后台取数据
  25.  
  26. // 重置加载flag
  27. axios.get('./src/assets/data/worksRank.json', {
  28. page: page,
  29. val: ""
  30. }).then(function (response) {
  31. loading = false;
  32.  
  33. //添加判断条件 如果返回的数组的数据小于每页应当加载的数据条数,则表示加载完毕
  34. if (response.data.length < itemsPerLoad) {
  35. // 加载完毕,则注销无限加载事件,以防不必要的加载
  36. $.detachInfiniteScroll($('.infinite-scroll'));
  37. // 删除加载提示符
  38. $('.infinite-scroll-preloader').remove();
  39. return;
  40. }
  41.  
  42. // 添加新条目
  43. // _this.addWorks(response.data);
  44. _this.worksList = _this.worksList.concat(response.data);
  45. page++;
  46. //容器发生改变,如果是js滚动,需要刷新滚动
  47. $.refreshScroller();
  48. });
  49. });
  50. }

然后在mounted内调用这两个函数,发现很快实现该无限加载的功能了。再继续研究下去,也受到一片文章的启发,其实所谓无限加载,不就是我们常说的分页么?

改变思路如下:

当页面滑动到底部的时候,仅仅增加页码,然后监听页码的变化,然后调用初始化时候的ajax请求,去请求后台数据。

  1. loadingMore(){
  2. var _this = this;
  3. // 注册'infinite'事件处理函数
  4. $(document).on('infinite', function() {
  5. // 如果正在加载,则退出
  6. if (_this.loading) return;
  7. // 设置flag
  8. _this.loading = true;
  9. // 无限加载,其实就是类似于分页的效果,增加页码
  10. _this.page++;
  11. });
  12. },
  1. watch: {
  2. page: function () {
  3. this.ajaxData();
  4. }
  5. }

向后台请求数据,需要带两个参数,一个是页码page,一个是值val,该值是为了搜索功能使用。

其他的操作全部放在ajax请求内部操作:

  1. ajaxData(){
  2. axios.get('./src/assets/data/works.json',{
  3. page: this.page,
  4. val: this.val
  5. }).then(function (response) {
  6. this.loading = false;
  7. // 为了美观,这里对获取到的推按进行了随机数的处理,实际项目中,不需要额外处理
  8. response.data.forEach(function (item, index) {
  9. var num = Math.ceil(Math.random()*162);
  10. num = num < 10 ? "00"+num : num < 100 ? "0" + num : num;
  11. item.src = item.src.replace(/[\d]+/, num);
  12. // 预加载
  13. var img = new Image();
  14. img.src = item.src;
  15. });
  16.  
  17. //添加判断条件 如果返回的数组的数据小于每页应当加载的数据条数,则表示加载完毕
  18. if (response.data.length < this.items) {
  19. // 加载完毕,则注销无限加载事件,以防不必要的加载
  20. $.detachInfiniteScroll($('.infinite-scroll'));
  21. // 删除加载提示符
  22. $('.infinite-scroll-preloader').remove();
  23. return;
  24. }
  25. if (this.page == 1) {
  26. this.works = response.data;
  27. } else {
  28. this.works = this.works.concat(response.data);
  29. }
  30.  
  31. // 如果是下拉刷新的话
  32. $.pullToRefreshDone('.pull-to-refresh-content');
  33.  
  34. }.bind(this));
  35. },

对于返回数据循环操作这一步可以不予关注,我这里主要是为了获取不同的图片,进行的随机数,实际请求过程中,每次返回的都是不同数据,不存在这一过程。

还有一个判断 :

  1. if (this.page == 1) {
  2. this.works = response.data;
  3. } else {
  4. this.works = this.works.concat(response.data);
  5. }

 这里需要判断当前页码是否为1,如果为1的话,返回的数据直接赋值给works,如果不是1,则在原有值的基础上追加,目的是方便下拉刷新和搜索。

 原以为到这里,已经彻底完成工作,但是在多次测试之后发现,还有一个更大的bug在那呢!

 路由跳转之后,必须刷新页面,才能实现新页面的无限加载,发现该问题之后,立即意识到了问题之所在:

由于路由点击之后,并没有为document绑定infinite事件,导致跳转之后的页面无法触发infinite事件,就无法实现无限加载。

解决问题的思路在于:在路由跳转页面的时候,关闭之前组件绑定的infinite事件,而在新组件中重新绑定infinite事件。

查询vue-router官方文档,发现“导航钩子”这一说法,共有三个钩子函数:

  • beforeRouteEnter
  • beforeRouteUpdate (2.2 新增)
  • beforeRouteLeave

这里需要用到的是beforeRouteLeave,在路由跳转离开的时候,关闭当前页面注册的“无限滚动事件”,在新组件mounted的时候重新绑定无限滚动事件”,代码修改为:

  1. beforeRouteLeave (to, from, next) {
  2. this.page =1;
  3. $.detachInfiniteScroll($(".infinite-scroll"));
  4. next(true);
  5. },

  

  1. mounted(){
  2. $.init()
  3. this.refresh();
  4. this.ajaxData();
  5. this.loadingMore();
  6. $.attachInfiniteScroll($(".infinite-scroll"));
  7. },

至此,使用vuejs搭配SUI-Mobile的瀑布流布局真正实现了,其中也遇到了各种槽点,初学vuejs,总得付出点填坑的代价的。  

vuejs实现瀑布流布局(二)的更多相关文章

  1. vuejs实现瀑布流布局(三)

    前面写过vuejs实现的瀑布流布局,<vuejs实现瀑布流布局(一)>和<vuejs实现瀑布流布局(二)>也确实实现了瀑布流布局,但是这个是基于SUI-Mobile实现的无限滚 ...

  2. vuejs实现瀑布流布局(一)

    一直以来,习惯了jquery的DOM操作方式,突然间,开始学习使用vuejs,很多时候,操作DOM观念总是转换不过来,虽然也能实现各种效果,但是总有点不伦不类的. 就类似于最近在做的瀑布流布局,正常的 ...

  3. CSS3学习总结——实现瀑布流布局与无限加载图片相册

    首先给大家看一下瀑布流布局与无限加载图片相册效果图: 一.pic1.html页面代码如下: <!DOCTYPE html> <html> <head> <me ...

  4. JavaScript——基本的瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  5. javascript实例学习之五——瀑布流布局

    瀑布流布局的特征: 1,各列的高度参差不齐 2,页面向下滚动时,自动请求和加载新数据 目前,瀑布流布局的主流实现方式有两种: 1,基于浮动,每一列是一个ul,这些ul都向左浮动,这种方法的好处是布局容 ...

  6. 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...

  7. Django 项目补充知识(JSONP,前端瀑布流布局,组合搜索,多级评论)

    一.JSONP 1浏览器同源策略 通过Ajax,如果在当前域名去访问其他域名时,浏览器会出现同源策略,从而阻止请求的返回 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一 ...

  8. 瀑布流布局js

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  9. Bootstrap实战 - 瀑布流布局

    讲 Bootstrap 基础的教程网上已经很多了,实际上 Bootstrap 中文网(bootcss.com)里的文档已经写的很详细了,但实战的案例却不多.这里用一些当前流行的网页布局为导向,使用 B ...

随机推荐

  1. ubuntu设置开机默认进入字符界面方法 ubuntu 12.04 桌面版关闭图形界面(转)

    ubuntu 12.04 桌面版关闭图形界面 注意]改GRUB 的配置文件(不建议直接改 grub.conf) file:/etc/default/grub GRUB_CMDLINE_LINUX_DE ...

  2. Jmeter --- 分布式测试

    在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能. 一.Jmeter分 ...

  3. php上传导入文件 nginx-502错误

    4. php程序执行时间过长而超时,检查nginx和fastcgi中各种timeout设置.(nginx 中的  fastcgi_connect_timeout 300;fastcgi_send_ti ...

  4. linux进程监控和简单的重启&服务的创建 参考自http://blog.csdn.net/lockheed_hong/article/details/73549837

    脚本文件 该脚本实现了一个检测进程是否存在,不存在的情况下重启进程并且记录日志. #! /bin/sh proc_name="console/queue/gift.php" # 进 ...

  5. linux 创建软链接

    ln –s 源文件 目标文件

  6. Thinkphp 关联模型

    1.定义关联模型 2.使用关联模型 D('BlogRelation')->relation(true)->add($data);

  7. NIO基本操作

    NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器) Channel(通道) ...

  8. STL基础--算法(修改数据的算法)

    修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87, ...

  9. Unity3d- 资源

    Data与Resources文件夹一般只读文件放到Resources目录Data用于新建的文件或者要修改的文件============================================= ...

  10. django获取表单数据

    django获取单表数据的三种方式 v1 = models.Business.objects.all() # v1是QuerySet的列表 ,内部元素都是对象 v2 = models.Business ...