vux loadmore + axios 实现点击加载更多

在微信项目中有应用过几个上拉加载更多的组件,但总会出现一些兼容性方面的bug,需要各种补漏(注:组件都是基于iscroll实现的, iscroll原本就有些坑)。Vux也有提供Scroller组件实现上拉加载或下拉刷新,但官方已经不再维护该组件(未实际使用过,不知是否有坑)。所以这次我们采用更为简单的方式来实现加载更多数据效果,废话不多说,直接看效果图。

实际效果图

实现思路

组件模板

<template>
  <div>
    <div v-for="(item,idx) in tableData"
         :key="idx"
         class="box">
      <slot :item="item"></slot>
    </div>
    <load-more v-if="loading"
               tip="正在加载"></load-more>
    <load-more v-else
               :show-loading="false"
               @click.prevent.native="load"
               :tip="tipText"
               background-color="#fbf9fe"></load-more>
  </div>
</template>

结合后端分页查询接口

export default {
data () {
    const _this = this
    return {
      tableData: [], // 列表数据
      loading: false,
      isLoadMore: true,
      // 查询参数
      queryJson: (() => {
        const { params } = _this
        return params
      })(),

      pageIndex: 1, // 当前页
      total: 0 // 数据总条数
    }
},
methods: {
    load () {
      if (!this.isLoadMore) {
        return
      }
      this.fetch()
    },
    fetch () {
      this.loading = true
      let { url, pageSize, pageIndex, sortName, sordName, listField, totalField,
        pageIndexField, pageSizeField, sortNameField, sordField } = this

      let params = Object.assign({}, this.queryJson)

      // 分页参数
      params = Object.assign(params, {
        [pageIndexField]: pageIndex,
        [pageSizeField]: pageSize
      })
      // 排序参数
      params = Object.assign(params, {
        [sortNameField]: sortName,
        [sordField]: sordName
      })
      axios.get(url, { params }).then(response => {
        this.total = response[totalField] // 总数
        let result = response[listField] // 当次加载的数据

        // 是否还可以加载更多 此种逻辑设计存在缺陷,如果在浏览列表的同时,又增加了新的记录
        this.isLoadMore = result.length === pageSize
        this.pageIndex++
        for (let item of result) {
          this.tableData.push(item)
        }
      }).catch(error => {
        console.error('获取数据失败 ', error)
      }).finally(() => {
        this.loading = false
      })
    }
 }
 }

变更loadmore组件内容

判断isLoadMore(是否正在加载)的值,以及tableData(显示数据列表内容) 的长度来控制底部loadmore组件显示的内容

computed: {
    tipText () {
      // 暂无数据, 没有更多数据, 轻按加载更多
      if (!this.tableData || this.tableData.length === 0) {
        return '暂无数据'
      }
      return this.isLoadMore ? '轻按加载更多' : '没有更多数据'
    }
  },

监听查询参数的变化

watch: {
    params: function (val) {
      this.queryJson = val
      this.pageIndex = 1
      this.tableData = []
      this.fetch()
    }
  },

具体应用

<template>
  <div>
    <group title='钱包明细'>
      <vloadmore v-bind="table">
        <template slot-scope="{ item }">
          <cell-box>
            <!-- 具体每一行的布局 -->
          </cell-box>
        </template>
      </vloadmore>
    </group>
  </div>
</template>
<script>
import { Group, CellBox } from 'vux'
import { CsLoadMore } from '@/components'
export default {
  data () {
    return {
      table: {
        url: '/pms/wallet/getpagelist',
        pageSize: 3
      }
    }
  },
  components: {
    Group,
    CellBox,
    vloadmore: CsLoadMore
  }
}
</script>

源码

组件源码请查看https://github.com/yinboxie/BlogExampleDemo/tree/master/Vux

原文地址:https://www.cnblogs.com/xyb0226/p/11146464.html

时间: 2024-08-26 22:59:16

vux loadmore + axios 实现点击加载更多的相关文章

vue点击加载更多——轻松实现vue底部点击加载更多

前言 这里接口直接请求了所有的数据,所以用的就不是分布请求的方法,而是逐步展现的方法 步骤 使用slice来进行限制展现从0,a的数据 <div v-for="user in draw_user.slice(0,a)" :key="user.uid" class="user-item"> //判断a的值是否小于数组的长度,小于就显示点击加载更多 <div class="load-more mr-bottom"

Android ListView 下拉刷新 点击加载更多

最近项目中用到了ListView的下拉刷新的功能,总结了一下前辈们的代码,单独抽取出来写了一个demo作为示例. 效果图 下拉刷新: 加载更多: CustomListView.java [java] view plaincopy package com.example.uitest.view; import java.util.Date; import com.example.uitest.R; import android.content.Context; import android.uti

android ListView的上部下拉刷新下部点击加载更多具体实现及拓展

转自:http://blog.csdn.net/jj120522/article/details/8229423 这次就不上图了,例子太多太多了,想必大家都见过.这个功能的实现,简直是开发者必备的. 我也不过多介绍了,网上详细介绍的博客太多太多了,若想深入了解,请参考网上其他博文. 在这里,我只是按照自己的理解,模拟实现了一个,顺便代码贡献出来. 我对之详细标明的注释,想必如果不懂的同学们,看注释也应该明白,前提是,你要耐心看,因为代码有点多,但是我整理过了,还算清晰. 详细代码: [java]

thinkPHP 点击加载更多

今天做了下点击加载更多,开始使用JSON返回做,可不知道哪里出问题,代码截图,希望可以指点我下 PHP部分: HTML: 这样msg是没数据的:......... 后面换了个办法,没返回json,具体这样 PHP: public function index_ajax() { $list=M('document')->where('status=1')->limit(0,5)->select(); $this->assign('list',$list); $this->dis

tableView中的“点击加载更多”点击不到

假设当前的tableView是_tableView,则可以这样设置 _tableView.contentInset = UIEdgeInsetsMake(0, 0, 100, 0); 该属性用于设置当前tableView的偏移量,四个数值分别是:上 左 下 右 使用该设置之后,即可以点击到“点击加载更多”按钮了

jQuery+php+Ajax文章列表点击加载更多功能

jQuery+php+Ajax实现的一个简单实用的文章列表点击加载更多功能,点击加载更多按钮,文章列表加载更多数据,加载中有loading动画效果. js部分: 1 <script type="text/javascript" src="jquery.more.js"></script> 2 <script type="text/javascript"> 3 $(function() { 4 $('#more'

js点击加载更多可以增加几条数据的显示

<div class="list"> <div class="one"> <div class="img"> <img src="../img/b6c.png"/> </div> <div class="infor"> <p class="detail">2018年8月陕西延长石油延安能源化工有限责任公司

Yii 1开发日记 -- Ajax实现点击加载下一页

功能实现:先输出一页的内容,然后点击加载下一页,如图 1.控制器中 1 /** 2 * 消费记录:列出用户购买章节的记录 3 */ 4 public function actionMyPayHis() 5 { 6 //点击加载更多 7 if( Yii::app()->request->isAjaxRequest ) { 8 //分页 9 $pg = isset( $_GET[ "pg" ] ) ? $_GET[ "pg" ] : 1; 10 $page

iOS开发UI篇—在UItableview中实现加载更多功能

一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据.                      二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器)会加载两条数据进来. 视图部分的按钮被点击的时候,要让主控制器加载数据,刷新表格,2B青年会在视图中增加一个主控制器的属性,通过这个属性去调用进行加载,但在开发中通常通过代理模式来完成这个操作. 下面分别是两种实现的代码. 1.项目结构和说明 说明:加载更多永远都放在这个tableview的最下端