如何封装了一个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 学习笔记
Mar 05 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
Jul 09 Javascript
jquery滚动条插件jScrollPane的使用介绍
Nov 08 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 Javascript
javascript中String对象的slice()方法分析
Dec 20 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
深入探究node之Transform
Jul 20 Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 Javascript
Vue父组件调用子组件事件方法
Feb 23 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
Oct 25 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP小教程之实现链表
2014/06/09 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP防盗链代码实例
2014/08/27 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
python分析网页上所有超链接的方法
2015/05/08 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
详解python基础之while循环及if判断
2017/08/24 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
python实现根据文件格式分类
2019/10/31 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
2014年教师政治学习材料
2014/06/02 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
校运会加油稿大全
2015/07/22 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书