mintui loadmore组件使用+代码优化

先上代码

// home.vue

<template>
  <div>
    <mt-navbar v-model="selected" ref="navbar">
      <mt-tab-item id="1">待处理</mt-tab-item>
      <mt-tab-item id="2">已完成</mt-tab-item>
    </mt-navbar>
    <mt-tab-container swipeable v-model="selected">
      <mt-tab-container-item id="1">
        <div class="tab-container-item-base" :style="{height: pd.loadMoreH}">
          <mt-loadmore :top-method="loadTop1" :autoFill="autoFill" :bottom-method="loadBottom1" :bottom-all-loaded="pageMore1.allLoaded" bottomPullText="上拉加载更多" ref="loadmore1">
            <ul :style="{minHeight: pd.loadMoreH}">
              <li v-for="item in pageMore1.pageList" @click="goMessage(item)">{{ item }}</li>
              <by-no-data v-show="!pageMore1.pageList.length"></by-no-data>
            </ul>
          </mt-loadmore>
        </div>
      </mt-tab-container-item>
      <mt-tab-container-item id="2">
        <div class="tab-container-item-base" :style="{height: pd.loadMoreH}">
          <mt-loadmore :top-method="loadTop2" :autoFill="autoFill" :bottom-method="loadBottom2" :bottom-all-loaded="pageMore2.allLoaded" bottomPullText="上拉加载更多" ref="loadmore2">
            <ul :style="{minHeight: pd.loadMoreH}">
              <li v-for="item in pageMore2.pageList">{{ item }}</li>
              <by-no-data v-show="!pageMore2.pageList.length"></by-no-data>
            </ul>
          </mt-loadmore>
        </div>
      </mt-tab-container-item>
    </mt-tab-container>
  </div>
</template>
<script>
  import { messagePageList } from "@/api/index.js"
  import { getClientH, getPosForView } from ‘@/libs/DOMUtil.js‘
  import LoadMore from ‘@/service/loadMore.js‘

  export default {
    name: ‘Home‘,
    components: {
    },
    data () {
      return {
        selected: ‘1‘,
        pd: {
          loadMoreH: ‘1px‘,
        },

        pageMore1: {
          pageList:[],
          allLoaded: false,
        },
        pageMore2: {
          pageList:[],
          allLoaded: false,
        },
        autoFill: false,
      }
    },
    mounted () {
      this.pd.loadMoreH = (getClientH() - getPosForView(this.$refs.loadmore1.$el).top) + ‘px‘
      this.loadTop1();
    },
    computed: {
    },
    methods: {
      loadTop1 () { //组件提供的下拉触发方法
        //下拉加载
        this.loadMore1.loadTop(this);
      },
      loadBottom1 () {
        // 上拉加载
        this.loadMore1.loadBottom(this);// 上拉触发的分页查询
      },
      loadTop2 () {
        this.loadMore2.loadTop(this);
      },
      loadBottom2 () {
        this.loadMore2.loadBottom(this);
      },
      goMessage (item) {
        this.$router.push(`message/${item.appraisalusrs_id}`)
      }
    },
    created () {
      this.loadMore1 = new LoadMore(‘loadmore1‘, ‘pageMore1‘, messagePageList, {appraisaltype_id: 0})
      this.loadMore2 = new LoadMore(‘loadmore2‘, ‘pageMore2‘, messagePageList, {appraisaltype_id: 1})
    },
    watch: {
      ‘selected‘ (n, o) {
        if (n === ‘2‘ && !this.loadmore2Inited){
          this.loadmore2Inited = true
          this.loadTop2();
        }
      }
    }
  }
</script>
<style scoped lang="less" rel="stylesheet/less">
  li {
    height: 200px;
  }
  .tab-container-item-base {
    background: #f5f5f5;
    overflow: scroll;
  }
</style>

// loadMore.js

/**
 * 针对mintui loadmore 分页组件的共用代码
 *
 */

export default class LoadMore {
  /**
   * 构造器
   * @param dom 分页组件 ref 名
   * @param container 分页数据容器(通过容器,操作页面数据)
   * container: {
   *       pageList:[],       // 数据集合
   *       allLoaded: false,  // 是否已全部加载完毕
   *    },
   * @param loadMoreApi 接口api
   * @param extraCondition  接口请求时 其他参数
   */
  constructor(dom, container, loadMoreApi, extraCondition={}) {
    this.searchCondition = Object.assign({fenyePage: 1}, extraCondition)
    this.$el = dom
    this.container = container
    this.loadMoreApi = loadMoreApi
  }

  loadTop(vm) { //组件提供的下拉触发方法
    //下拉加载
    this.loadInit(vm);
    vm.$refs[this.$el].onTopLoaded();// 固定方法,查询完要调用一次,用于重新定位
  }

  loadBottom(vm) {
    // 上拉加载
    this.loadMore(vm);// 上拉触发的分页查询
    vm.$refs[this.$el].onBottomLoaded();// 固定方法,查询完要调用一次,用于重新定位
  }

  loadInit(vm) {
    // 查询数据
    this.searchCondition.fenyePage = 1
    this.loadMoreApi(this.searchCondition).then(data => {
      // 是否还有下一页,加个方法判断,没有下一页要禁止上拉
      this.isHaveMore(vm, data.current_page, data.last_page)
      vm[this.container].pageList = data.data;
      /*vm.$nextTick(function () {
       // 原意是DOM更新循环结束时调用延迟回调函数,大意就是DOM元素在因为某些原因要进行修改就在这里写,要在修改某些数据后才能写,
       // 这里之所以加是因为有个坑,iphone在使用-webkit-overflow-scrolling属性,就是移动端弹性滚动效果时会屏蔽loadmore的上拉加载效果,
       // 花了好久才解决这个问题,就是用这个函数,意思就是先设置属性为auto,正常滑动,加载完数据后改成弹性滑动,安卓没有这个问题,移动端弹性滑动体验会更好
       vm.scrollMode = "touch";
       });*/
    });
  }

  loadMore(vm) {
    // 分页查询
    this.searchCondition.fenyePage++
    this.loadMoreApi(this.searchCondition).then(data=> {
      vm[this.container].pageList = vm[this.container].pageList.concat(data.data);
      this.isHaveMore(vm, data.current_page, data.last_page);
    });
  }

  isHaveMore(vm, current_page, last_page) {
    // 是否还有下一页,如果没有就禁止上拉刷新
    vm[this.container].allLoaded = true; //true是禁止上拉加载
    if (current_page < last_page) {
      vm[this.container].allLoaded = false;
    }
  }
}

// DOMUtil.js

/**
 * 得到body高度
 * @returns {Number|number}
 */
export const getClientH = () => {
  return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
}
/**
 * 得到元素相对窗口的位置信息-相对于左上角
 * @returns {Number|number}
 */
export const getPosForView = ($el) => {
  return $el.getBoundingClientRect()
}

注意事项

1、父容器 须设置 height ;且overflow: scroll;
2、组件内根元素 设置 min-height 与父容器同高:解决 内容不足父容器高度 时,显示问题。
3、auto-fill="false" 去掉自动检测。
4、ios下loadmore组件和-webkit-overflow-scrolling属性冲突无法上拉问题

原文地址:https://www.cnblogs.com/fan-zha/p/11103982.html

时间: 2024-11-09 03:16:46

mintui loadmore组件使用+代码优化的相关文章

mint-ui loadmore组件注意问题

loadTop(){ this.$store.dispatch('getNewsList',{channelId:this.id,page:0,size:this.size}); this.$refs.loadmore.onTopLoaded(); }, 比如在做下拉刷新的时候,切记在下拉刷新的函数中要加 this.$refs.loadmore.onTopLoaded(); 这行代码,否则下拉加载之后一直显示加载中,而不会加载完成.

Mint UI 之loadmore组件的坑:内部元素头部被遮挡了一部分

前端经常会遇到数据分页加载的需求,mint-ui组件为大家提供了loadmore组件 但是我在使用的时候,遇到了一个问题:写好布局和样式以及逻辑之后,我的mt-loadmore标签的头部总是不顶在父元素content的顶部,给了padding也不管用;看了下mint-loadmore-top样式有.mint-loadmore-top { margin-top: -50px; }但这个不能改,改了后下拉显示更多...就会一直显示. 网上看到说添加:auto-fill:"false"结果还

vue2 mint-ui loadmore(下拉刷新,上拉更多)

<template> <div class="page-loadmore"> <h1 class="page-title">Pull up</h1> <p class="page-loadmore-desc">在列表底部, 按住 - 上拉 - 释放可以获取更多数据</p> <p class="page-loadmore-desc">transl

基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无限滚动加载不需要写首次载入列表的函数, 代码如下: html: //父组件 <div v-infinite-scroll="loadMore" infinite-scroll-disabled="loading" infinite-scroll-distance=

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

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

手撸一个Vue滚动加载自定义指令

用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动加载. 核心的api document.body.scrollTop 滚动条滚动的距离 (这个有兼容性问题,兼容性写法) let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body

使用vue.js仿一个链家

Vue全家桶+localstorage+socket.io简单仿一个链家 在线预览地址首先上项目和预览地址 https://luxroid.com/lianjia/#/Github地址 https://github.com/mixihome/lianjia 注意 如果要在本地运行安装完依赖之后如果报错请手动使用淘宝镜像安装node-sass和sass-loader 确保可以运行建议使用F12移动端模式预览???? 使用到的技能点Vue.js : 前端页面展示Vuex : 全局状态通信axios

vue.js中滚动条加载更多数据

本文章参考:http://www.cnblogs.com/ssrsblogs/p/6108423.html 分析:1.需要判断滚动条是否到底部: 需要用到DOM的三个属性值,即scrollTop.clientHeight.scrollHeight. scrollTop为滚动条在Y轴上的滚动距离. clientHeight为内容可视区域的高度. scrollHeight为内容可视区域的高度加上溢出(滚动)的距离. 从这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollTop + cl

vue和react总结

一.总结一下Vue和React的区别 相同点:   1.都支持服务器端渲染     2.都有Virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范     3.数据驱动视图     4.都有支持native的方案,React的React native,Vue的weex     5.都有管理状态,React有redux,Vue有自己的Vuex(自适应vue,量身定做) 不同点:   1.React严格上只针对MVC的view层,Vue则是M