全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue loadmore 组件滑动加载更多源码解析

上一篇讲到在项目中使用上拉加载更多组件,但是由于实际项目开发中由于需求变更或者说在webview中上拉加载有些机型在上拉时候会把webview也一起上拉导致上拉加载不灵敏等问题,我们有时候也会换成滑动到底部自动加载的功能。

既然都是加载更多,很多代码思想势必相似,主要区别在于上拉和滑动到底部这个操作上,所以,我们需要注意:

上拉加载是point指针touch触摸事件,现在因为是滑动加载,需要添加scroll事件去监听然后执行相应回调

上拉加载主要计算触摸滚动距离,滑动加载主要计算container底部和视窗上边缘的距离

事件绑定改成: 

 mounted() {
  ···
  this.dom.addEventListener('scroll', this.scroll, false)
  ···
 },
 beforeDestroy() {
  ···
  this.dom.removeEventListener('scroll', this.scroll, false)
  ···
 },

事件回调改为:

 /**
  * 滚动钩子
  */
  scroll() {
  const viewHeight = global.innerHeight
  let parentNode
  if (this.container !== global) {
   parentNode = this.$el
  } else {
   parentNode = this.$el.parentNode
  }
  if (parentNode) {
   // 获取Vue实例使用的根 DOM 元素相对于视口的位置
   const rect = parentNode.getBoundingClientRect()
   // this.distance 离底部多少距离开始加载
   // 如果此元素底边距离视口顶部的距离小于视口高度加上distance之和,就加载下一页
   if ((rect.bottom <= viewHeight + this.distance) && this.loadable && !this.loading) {
   this.load()
   }
  }
  },

源码如下:

<template>
 <div class="loadmore" ref="loadmore">
 <div class="loadmore__body">
  <slot></slot>
 </div>
 <div class="loadmore__footer">
  <span v-if="loading">
  <i class="tc-loading"></i>
  <span>正在加载</span>
  </span>
  <span v-else-if="loadable">加载更多</span>
  <span v-else>没有更多了</span>
 </div>
 </div>
</template>
<script type="text/babel">
 import axios from 'axios'
 const CancelToken = axios.CancelToken
 export default {
 data() {
  return {
  /**
   * 总页数(由服务端返回)
   * @type {number}
   */
  count: 0,
  /**
   * 是否正在拖拽中
   * @type {boolean}
   */
  dragging: false,
  /**
   * 已加载次数
   * @type {number}
   */
  times: 0,
  /**
   * 已开始记载
   * @type {boolean}
   */
  started: false,
  /**
   * 正在加载中
   * @type {boolean}
   */
  loading: false,
  dom: null,
  }
 },
 props: {
  /**
  * 初始化后自动开始加载数据
  */
  autoload: {
  type: Boolean,
  default: true,
  },
  /**
  * 离组件最近的可滚动父级元素(用于监听事件及获取滚动条位置)
  */
  container: {
  // Selector or Element
  default: () => (global),
  },
  /**
  * Axios请求参数配置对象
  * {@link https://github.com/mzabriskie/axios#request-config}
  */
  options: {
  type: Object,
  default: null,
  },
  /**
  * 起始页码
  */
  page: {
  type: Number,
  default: 1,
  },
  /**
  * 每页加载数据条数
  */
  rows: {
  type: Number,
  default: 10,
  },
  /**
  * 数据加载请求地址
  */
  url: {
  type: String,
  default: '',
  },
  /**
  * 距离底部多远加载
  */
  distance: {
  type: Number,
  default: 200,
  },
 },
 computed: {
  /**
  * 是否可以加载
  * @returns {boolean} 是与否
  */
  loadable() {
  return !this.started || (this.page + this.times) <= this.count
  },
 },
 mounted() {
  if (this.container !== global) {
  this.dom = document.querySelector(this.container)
  } else {
  this.dom = this.container
  }
  if (!this.dom) {
  return
  }
  this.dom.addEventListener('scroll', this.scroll, false)
  if (this.autoload && !this.loading) {
  this.load()
  }
 },
 // eslint-disable-next-line
 beforeDestroy() {
  if (this.dom) {
  this.dom.removeEventListener('scroll', this.scroll, false)
  }
 },
 methods: {
  /**
  * 滚动钩子
  */
  scroll() {
  const viewHeight = global.innerHeight
  let parentNode
  if (this.container !== global) {
   parentNode = this.$el
  } else {
   parentNode = this.$el.parentNode
  }
  if (parentNode) {
   const rect = parentNode.getBoundingClientRect()
   if ((rect.bottom <= viewHeight + this.distance) && this.loadable && !this.loading) {
   this.load()
   }
  }
  },
  /**
  * 加载一组数据的方法
  */
  load() {
  if (this.loading) {
   return
  }
  this.started = true
  this.loading = true
  const params = {
   currentPage: this.page + this.times,
   pageSize: this.rows,
  }
  const options = Object.assign({}, this.options, {
   url: this.url,
   cancelToken: new CancelToken((cancel) => {
   this.cancel = cancel
   }),
  })
  if (String(options.method).toUpperCase() === 'POST') {
   options.data = Object.assign({}, options.data, params)
  } else {
   options.params = Object.assign({}, options.params, params)
  }
  this.$axios.request(options).then((res) => {
   const data = res.result
   this.times += 1
   this.loading = false
   this.count = data.pageCount
   this.$emit('success', data.list)
   this.$emit('complete')
  }).catch((e) => {
   this.loading = false
   this.$emit('error', e)
   this.$emit('complete')
  })
  },
  /**
  * 重置加载相关变量
  */
  reset() {
  this.count = 0
  this.times = 0
  this.started = false
  this.loading = false
  },
  /**
  *重新开始加载
  */
  restart() {
  this.reset()
  this.load()
  },
 },
 }
</script>

以上所述是小编给大家介绍的vue loadmore 组件滑动加载更多源码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# vue  # loadmore  # 滑动加载更多  # 基于Vue实现页面切换左右滑动效果  # Vue实现移动端左右滑动效果的方法  # vue实现一个移动端屏蔽滑动的遮罩层实例  # vue2.0移动端滑动事件vue-touch的实例代码  # vue中选项卡点击切换且能滑动切换功能的实现代码  # vue-router 手势滑动触发返回功能  # vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】  # 使用Vue 实现滑动验证码功能  # Vue实现固定定位图标滑动隐藏效果  # 使用vue制作滑动标签  # Vue 实现从小到大的横向滑动效果详解  # 加载  # 回调  # 小编  # 都是  # 也会  # 多远  # 下一页  # 在此  # 每页  # 给大家  # 会把  # 或者说  # 上一篇  # 相对于  # 在上  # 讲到  # 所述  # 绑定  # 需要注意  # 正在加载 


相关文章: 免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何基于PHP生成高效IDC网络公司建站源码?  如何通过服务器快速搭建网站?完整步骤解析  制作网站怎么制作,*游戏网站怎么搭建?  如何用已有域名快速搭建网站?  网站制作服务平台,有什么网站可以发布本地服务信息?  如何快速启动建站代理加盟业务?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  建站DNS解析失败?如何正确配置域名服务器?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  建站主机选择指南:服务器配置与SEO优化实战技巧  实现虚拟支付需哪些建站技术支撑?  如何选择高效可靠的多用户建站源码资源?  C#怎么使用委托和事件 C# delegate与event编程方法  Python多线程使用规范_线程安全解析【教程】  如何快速生成ASP一键建站模板并优化安全性?  如何在橙子建站中快速调整背景颜色?  如何通过万网虚拟主机快速搭建网站?  宝塔面板如何快速创建新站点?  电商网站制作公司有哪些,1688网是什么意思?  制作网站的模板软件,网站怎么建设?  香港服务器租用费用高吗?如何避免常见误区?  如何彻底删除建站之星生成的Banner?  已有域名如何免费搭建网站?  学校为何禁止电信移动建设网站?  如何设置并定期更换建站之星安全管理员密码?  如何制作一个表白网站视频,关于勇敢表白的小标题?  想学网站制作怎么学,建立一个网站要花费多少?  建站之星2.7模板:企业网站建设与h5定制设计专题  济南专业网站制作公司,济南信息工程学校怎么样?  建站之星图片链接生成指南:自助建站与智能设计教程  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何用腾讯建站主机快速创建免费网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在搬瓦工VPS快速搭建网站?  建站主机如何选?性能与价格怎样平衡?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何快速搭建高效WAP手机网站吸引移动用户?  红河网站制作公司,红河事业单位身份证如何上传?  如何在景安服务器上快速搭建个人网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何确认建站备案号应放置的具体位置?  大同网页,大同瑞慈医院官网?  ,交易猫的商品怎么发布到网站上去?  建站三合一如何选?哪家性价比更高?  建站VPS能否同时实现高效与安全翻墙? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。