vue实现下拉加载其实没那么复杂


Posted in Javascript onAugust 13, 2019

前言

之前缺乏移动端的经验。一直不知道上拉加载,下拉刷新是怎么实现的。现在正好有个产品有这样一个需求。想了一会没有思路。就去找插件。啥vue-infinite-scroll,vue-virtual-scroll-list。啊呀,牛!无限滚动,十万条数据渲染。

经过我一大圈的折腾。还是默默的卸载了插件。我只是需要实现一个下拉加载,不需要其他这么多的功能。看了看其他人的源码,直接撸了起来,实现一个List组件。

效果展示

vue实现下拉加载其实没那么复杂

MList.vue

<template>
 <div class="list-wrap">
  <div class="content" ref="list" @scroll="onScroll">
   <slot></slot>
  </div>
  <div class="loading" v-show="loading">正在加载数据......</div>
 </div>
</template>
<script lang='ts'>
import { Component, Vue, Watch, Prop } from "vue-property-decorator";
@Component({
 components: {}
})
export default class extends Vue {
 @Prop()
 private loading!: boolean;
 private onScroll() {
  const obj: any = this.$refs.list;
  // clientHeight 视口高度 scrollTop 滚动条离顶部的高度 scrollHeight 列表内容的高度
  if (obj.clientHeight + obj.scrollTop === obj.scrollHeight) {
   this.$emit("toBottom");
  }
 }
}
</script>
<style scoped lang="scss">
.list-wrap {
 width: 100%;
 height: 100%;
 position: relative;
 .content {
  width: 100%;
  height: 100%;
  overflow-y: scroll;
 }
 .loading {
  position: absolute;
  bottom: -20px;
  width: 100%;
  height: 20px;
  color: #ffffff;
 }
}
::-webkit-scrollbar { // 去除滚动条边框
 width: 0 !important;
}
::-webkit-scrollbar {
 width: 0 !important;
 height: 0;
}
</style>

使用组件

<div class="body">
   <m-list @toBottom="fetchNewData()" :loading="loading">
    <code-info class="item" v-for="(item,index) in dataList" :key="index"></code-info>
   </m-list>
</div>

 private dataList: any[] = [1, 2, 3, 4, 5, 6, 7, 8];
 private loading: boolean = false;
 private fetchNewData() {
  this.loading = true;
  setTimeout(() => {
   this.dataList.push(1, 2, 3);
   const ref: any = this.$refs.vueLoad;
   this.loading = false;
  }, 1000);
 }

这里需要注意的是m-list的父容器一定要固定高度,本例为body。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
js获得页面的高度和宽度的方法
Feb 23 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
Jun 02 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
Feb 28 Javascript
js随机生成一个验证码
Jun 01 Javascript
BootStrap模态框不垂直居中的解决方法
Oct 19 Javascript
vue组件的写法汇总
Apr 12 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 Javascript
JavaScript自定义超时API代码实例
Apr 30 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 Javascript
vue中created和mounted的区别浅析
Aug 13 #Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 #Javascript
微信小程序使用npm包的方法步骤
Aug 13 #Javascript
Vue中的transition封装组件的实现方法
Aug 13 #Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
Aug 12 #Javascript
详解json串反转义(消除反斜杠)
Aug 12 #Javascript
json 带斜杠时如何解析的实现
Aug 12 #Javascript
You might like
php排序算法实例分析
2016/10/17 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
[IE&amp;FireFox兼容]JS对select操作
2007/01/07 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
学习python需要有编程基础吗
2020/06/02 Python
python语言的优势是什么
2020/06/17 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
期末自我鉴定
2014/02/02 职场文书
小学生检讨书大全
2014/02/06 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
员工趣味活动方案
2014/08/27 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
安全保证书怎么写
2015/02/28 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
行政介绍信范文
2015/05/04 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书