以asp.net 为后端,结合Vue.js和axios、vue-infinite-scroll实现滚动加载

滚动加载或者说是无限加载,是一种当今非常流行的列表显示方式。当一个列表内容太长,通常需要使用分页的形式去展现出来,可是老是需要用户去点击下一页又显得很不人道,于是滚动加载的技术就出来了,只要内容滚动到底部,就自动加载出下一页的内容出来,用户体验刚刚的。

在这个例子当中,我用了asp.net mvc,首先对数据进行分页输出JSON,再利用Vue.js配合axios,通过AJAX的方法获取数据,最后使用vue-infinite-scroll实现滚动加载。

得到分页数据,在控制器当中,新建一个Getlist,pageIndex代表当前是第几页,pageSize是一页显示多少笔数据,最后totalCount返回一个这个列表的总数据。

public List<Product> Getlist(int pageIndex, int pageSize, ref int totalCount)
        {
            var list=(from p in listall orderby p.ID descending select p).Skip((pageIndex - 1) * pageSize).Take(pageSize);
            totalCount = listall.Count();
            
            return list.ToList();
        }

接着,我们还需要生成一个已经分页完成的JSON,并且记录好总页数,一并输出:

 [HttpPost]
        public ActionResult ShowthePro(int? page)
        {
            int pageSize = 8;
            int pageIndex = page ?? 1;
            int totalCount = 0;
            
            var listpage = Getlist(pageIndex, pageSize, ref totalCount);
            int totalpage = (totalCount / pageSize) + 1;
            return Json(new {
                count=totalpage,
                data=listpage
            }, JsonRequestBehavior.AllowGet);
        }

这个时候,我们先使用Vue.js和axios测试一下不自动分页,看看有没有什么问题。先写js:

   Vue.prototype.$http = axios;
    new Vue({
        el: '#Pro',
        data: {
            peps: ''
        },
        mounted() {
            this.$http.post('/Json/ShowthePro?page=1').then(response=>this.peps = response.data.data);
        }
    })

然后将视图的模板做好:

 <div class="row" id="Pro">
        <article class="work-item" v-for = "pep in peps">
            <a :href=pep.url class="icon fa-desktop" target="_blank"><img :src=pep.img alt="" />
              <h3>{{pep.name}}</h3></a>
        </article>

    </div>

运行成功,接着我们就要用到vue-infinite-scroll来实现滚动加载。

vue-infinite-scroll Github 主页,可以去这里下载,然后本地加载,当然也可以使用CDN: https://unpkg.com/vue-infinite-scroll

选项

选项 说明
infinite-scroll-disabled 如果此属性的值为true,则无限滚动将被禁用。
infinite-scroll-distance Number(default = 0)当元素底部与窗口底部的距离达到这个数值时,执行v-infinite-scroll
infinite-scroll-immediate-check Boolean(default = true)指示在绑定后应立即检查该伪指令。 如果内容不够高以填满可滚动容器,则很有用。
infinite-scroll-listen-for-event 当Vue实例中发生事件时,无限滚动将再次检查。

了解了基本应用后,我们首先加载vue-infinite-scroll到我们页面

<script src="/Scripts/vue-infinite-scroll.js"></script>

接着修改视图代码,对#Pro增加选项:

 <div class="row" id="Pro"  v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
   .......
   </div>

最后修改js代码,这是很关键的一步,我们已经完成后端分页并且以JSON输出,那么在这里我们只需要让其滚动就自动加载分页好的JSON,当页数到达总数时,我们就停止滚动加载。

从网上扒下一个实例,我们就照这个实例进行修改好了:

<template>
    <div class="group-container" v-infinite-scroll="getActiveByAxios" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
    </div>
    <load-more tip="正在加载" v-if="showLoading"></load-more>
</template>

  <script>
  import Vue from 'vue'
  import Axios from 'axios'
  import { LoadMore  } from 'vux'
  import infiniteScroll from 'vue-infinite-scroll'

  Vue.use(infiniteScroll);

 export default{
     data(){
         return {
          showLoading:true,
          busy: false,
          pageInfo:{
            count:0,
            pageIndex:1,
            pageSize:5
          },
         }
     },
     methods:{
         getActiveByAxios(){
                         if((that.pageInfo.pageIndex - 1) * that.pageInfo.pageSize >                     that.pageInfo.count){
                that.busy = false;
                that.showLoading = false;
                return;
              }
              Axios.get('url',{
                params:{
                  pageSize:that.pageInfo.pageSize,
                  pageNum:that.pageInfo.pageIndex
                }
              }).then(function (response) {
                if (response.data.success){
                  let list = response.data.data.commentList;
                  that.comments = that.comments.concat(list);
                  that.pageInfo.count = response.data.data.page.count;
                  that.pageInfo.pageIndex += 1;
                  setTimeout(() => {
                    that.busy = false;
                  }, 10);
                }
              }).catch(function (error) {
        
              })
         }
     }
 }
          
</script>

我第一次写的时候发生了一点意外,就是没有使用concat连接起来,导致页面一页一页的翻过去但没有累加起来:

<script>
    Vue.prototype.$http = axios;
    var page = 1;
    
    new Vue({
        el: '#Pro',
        data: {
            pros: ''
        },
        busy: false,
        methods: {
            loadMore: function () {
                this.busy = true;
                
                setTimeout(() => {
                    this.$http.post('/Json/ShowthePro?page=' + page).then(response=>this.pros = response.data.data);
                        this.busy = false;

                    }, 1000);
                    page++;
                
                //End fro loadMore

            }
        }
       
    })
</script>

可是一旦concat连接起来,JSON数据就会出现连接不上的情况,我在Chorme安装了Vue Dvetool插件后,看到连接的JSON数据发生错误,我觉得是初始化的JSON和第一页的JSON数据concat起来发生错误,那么只要让代码确认初始化的JSON不参与concat就可以了,代码相当简单:

 vm.$http.get('/Json/ShowthePro?page=' + pages).then(
                    function (response) {
                        var list1 = response.data.pros;
if (vm.pros.length == 0) {
                            this.pros = list1;
                        }
                        else {
                          var list2 = vm.pros;
                            vm.pros = list2.concat(list1);}  
                      pages++;
                        setTimeout(() => {
                            vm.busy = false;
                        }, 1000);
                    });

测试通过。

为了防止当前页面超过所有页面还要继续读取数据,我这里使用了一个布尔变量,当超过页面总数时,整个无限加载就停止运行。

完整代码如下:

 Vue.prototype.$http = axios;
    var pages = 1;
    var totrue = true;
    new Vue({
        el: '#Pro',
        data: {
           pros:''
        },
        busy: false,
        methods: {
            loadMore: function () {
                this.busy = true;
                var vm = this;
                if (totrue){
                vm.$http.get('/Json/ShowthePro?page=' + pages).then(
                    function (response) {
                        var list1 = response.data.pros;
                        var count = response.data.count;
                        console.log(count);
                        if (vm.pros.length == 0) {
                            vm.pros = list1;
                        }
                        else {
                            if (pages <= parseInt(count)){
                            var list2 = vm.pros;
                            vm.pros = list2.concat(list1);
                          
                            }
                            else {
                                totrue = false;
                            }
                        }
                        pages++;
                        setTimeout(() => {
                            vm.busy = false;
                        }, 1000);
                    });
                } else {

                }
                //End fro loadMore

            }
        }
       
    })

每次开始一个新的框架或者新的语言,就像初恋中的男女一样,在没有确定关系之前各种试探各种伤害,等到完全上手以后,各种温柔各种甜蜜~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • 来源:github.com Vue.js开源项目速查表:https://www.ctolib.com/cheats...
    zhangtaiwei阅读 11,612评论 1 159
  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 23,113评论 8 124
  • UI组件element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于...
    董董董董董董董董董大笨蛋阅读 8,510评论 6 123
  • 经典for循环优点:​简单 缺点:​由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数...
    LuisX阅读 1,306评论 3 14
  • 我觉得我绝对算是一枚好人。 几顿饱饭吃出了一个胰腺炎,这也是没谁了。一住院,护士就提出忠告“这病终身难治愈,不能喝...
    憨蝴蝶阅读 342评论 0 0