如何封装了一个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 相关文章推荐
jquery下组织javascript代码(js函数化)
Aug 25 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
jquery删除ID为sNews的tr元素的内容
Apr 10 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
May 30 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
Nov 22 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
Dec 07 Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 Javascript
在Vue中创建可重用的 Transition的方法
Jun 02 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/10/30 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
基于JS实现限时抢购倒计时间表代码
2017/05/09 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
vue生命周期实例小结
2018/08/15 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
举例讲解Python中的算数运算符的用法
2015/05/13 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
岗位职责的含义
2013/11/17 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
踏青活动策划方案
2014/08/19 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
毕业设计致谢语
2015/05/14 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB