如何封装了一个vue移动端下拉加载下一页数据的组件


Posted in Javascript onJanuary 06, 2019

前言

简单封装了一个vue下拉加载组件,分享一下,已放到github和前端资源库,欢迎下载!

组件代码

<template>
 <div class="my-scroll" :class="[scrollState?'prohibit':'allow']" ref="myScroll" @scroll.passive="onScroll($event)" @touchmove="onScroll($event)" >
  <!-- top -->
  <div class="scroll-list">
   <slot name='scrollList'></slot>
   <div class="scroll-bottom">
    <div v-if="state==1">
     <i><img :src="Load"/></i>
     <p>加载中</p>
     </div>
    <div v-if="state==2">加载完成</div>
    <div v-if="state==3">没有数据了</div>
   </div>
  </div>
 </div>
</template>
<script type="text/javascript">
import Load from '@/assets/Load.gif'
export default {
 name: 'myScroll',
 props: {
 'onPull': { // 加载回调
  type: Function,
  require: true
 },
 'scrollState': {// 是否可滑动
  type: Boolean,
  require: true
 },
 loaded: {
  type: Boolean,
  default() {
  return false
  }
 }
 },
 data() {
 return {
  Load,
  timeoutId: null,
  state: 0,
  myScroll: null
 }
 },
 methods: {
 /*
    * 加载中:1
    * 加载完成:2
    * 没有更多:3
    */
 setState(index) { // 修改状态
  this.state = index
  // console.log(this.state)
 },
 onScroll(e) {
  const _this = this
  const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
  // console.log(window.innerHeight + scrollTop, this.myScroll.offsetHeight)
  if (!this.loaded && window.innerHeight + scrollTop - 50 >= this.myScroll.offsetHeight) {
  clearTimeout(this.timeoutId)
  _this.timeoutId = setTimeout(() => {
   _this.bottomCallback()
  }, 100)
  }
 },
 bottomCallback() { // 加载回调
  // console.log('回调', new Date().getTime())
  if (this.state != 3) {
  this.state = 1
  this.onPull()
  }
 }
 },
 mounted() {
 this.myScroll = this.$refs.myScroll // 获取滑条dom
 }
}
</script>
<style lang="scss" scoped>
 .allow{
  overflow:hidden;
  height: auto;
 }
 .prohibit{
  max-width: 100%;
  max-height: 100%;
  height: 100%;
  overflow:hidden;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
  will-change: transform;
  transition: all 450ms;
  backface-visibility: hidden;
  perspective: 1000;
 }
 .my-scroll{
  position: relative;
   color: #999;
  .scroll-top{
   text-align: center;
   display:flex;
   position:absolute;
   top:0;
   left:0;
    width:100%;
    overflow: hidden;
  }
  .scroll-list{
   overflow:hidden;
   min-height: 100%;
  }
  .scroll-bottom{
   text-align: center;
   line-height: .8rem;
  div{
    display:flex;
     height:auto;
    width:100%;
    justify-content: center;
    align-items:center;
    flex-wrap: wrap;
    i{
     flex:1 0 100%;
     display:block;
     height: 0.4rem;
    }
    img{
     width:0.6rem;
    }
    p{
     flex:1 0 100%;
    }
   }
  }
 }
</style>

使用

<template>
 <div id="app">
  <my-scroll class="scrolls" ref="myScroll" :on-pull="getList" :loaded="loaded" :scroll-state="scrollState">
   <div slot="scrollList">
   <div class="list" v-for="(item,index) in listData" :key="index">{{item.name}}</div>
   </div>
  </my-scroll>
 </div>
</template>
<script>
import myScroll from "./components/vue-scroll.vue";
import axios from 'axios'
export default {
 name: "app",
 data(){
 return{
  scrollState: true, // 是否可以滑动
  loaded: false,
  iPage: 1,
  listData:[],
  iPageSize: 10,
 }
 },
 methods: {
 getList(){
  this.$refs.myScroll.setState(1)
  let _this = this
  // ajax 请求
  axios.get('https://easy-mock.com/mock/5b90f971ce624c454133ee2d/scoll/datalist').then(function (response) {
   if (response.data.code == 200 && response.data.data.pagelist.length > 0 && !_this.loaded) {
    if (_this.iPage == 1) {
    _this.listData = response.data.data.pagelist
    } else {
    _this.listData.push(...response.data.data.pagelist)
    }
    _this.iPage++
    _this.$refs.myScroll.setState(2)
   } else {
    if (_this.iPage == 1) {
    _this.czListData = []
    }
    _this.loaded = true
    _this.$refs.myScroll.setState(3)
   } 
   })
   .catch(function (error) {
   console.log(error);
   });
  }

 },
 mounted () {
 this.getList() 
 },
 components: {
 myScroll
 }
};
</script>

<style scoped>
#app {
 font-family: "Avenir", Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
.scrolls{
 font-size:.24rem;
}
.list{
 height:.9rem;
 line-height: .9rem;
 margin-bottom:.1rem;
 border-bottom:1px solid #dedede;
 color:#999;
 font-size:.28rem;
}
</style>

组件已放到github,欢迎下载和star

可以直接在vue项目中运行这个组件

github地址:https://github.com/confidence68/vue_mobile_scrollLoadpage

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
漂亮的提示信息(带箭头)
Mar 21 Javascript
jquery构造器的实现代码小结
May 16 Javascript
jquery 年会抽奖程序
Dec 22 Javascript
JQuery.closest(),parent(),parents()寻找父结点
Feb 17 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
Aug 27 Javascript
jQuery Migrate 1.1.0 Released 注意事项
Jun 14 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
Vue封装的组件全局注册并引用
Jul 24 Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 Javascript
javascript实现简单搜索功能
Mar 26 Javascript
浅谈在Vue.js中如何实现时间转换指令
Jan 06 #Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 #Javascript
react-router4按需加载(踩坑填坑)
Jan 06 #Javascript
React 实现拖拽功能的示例代码
Jan 06 #Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 #Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 #Javascript
Bootstrap4 gulp 配置详解
Jan 06 #Javascript
You might like
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
php学习笔记之面向对象
2014/11/08 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python调用外部程序的实操步骤
2019/03/04 Python
django解决订单并发问题【推荐】
2019/07/31 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
2014年关于两会精神的心得体会
2014/03/17 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
应届大学生求职信
2014/07/20 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
股份合作协议书
2014/09/10 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
Springboot中如何自动转JSON输出
2022/06/16 Java/Android
DQL数据查询语句使用示例
2022/12/24 MySQL