如何封装了一个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 相关文章推荐
javascript smipleChart 简单图标类
Jan 12 Javascript
基于jQuery的简单九宫格实现代码
Aug 09 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
May 11 Javascript
jQuery.extend()的实现方式详解及实例
Jun 29 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
Aug 07 Javascript
JavaScript中Date对象的常用方法示例
Oct 24 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 Javascript
flexible.js实现移动端rem适配方案
Apr 07 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
php计算十二星座的函数代码
2012/08/21 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
jQuery的三种$()
2009/12/30 Javascript
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
2015/10/19 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JavaScript简单计算人的年龄示例
2017/04/15 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
实现vuex原理的示例
2020/10/21 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python中类的属性和方法介绍
2018/11/27 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python如何保存文本文件
2020/06/07 Python
深入浅析Python代码规范性检测
2020/07/31 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
青年文明号服务承诺
2014/03/31 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书