如何封装了一个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 相关文章推荐
斜45度寻路实现函数
Aug 20 Javascript
js动态设置div的值下例子
Oct 29 Javascript
javascript日期格式化示例分享
Mar 05 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
Jun 30 Javascript
node.js中的fs.chmodSync方法使用说明
Dec 18 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
Apr 13 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
JavaScript触发onScroll事件的函数节流详解
Dec 14 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
浅谈vue项目如何打包扔向服务器
May 08 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
Sep 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
一个简单的PHP入门源程序
2006/10/09 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
python 域名分析工具实现代码
2009/07/15 Python
Python 专题四 文件基础知识
2017/03/20 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
基于python实现把图片转换成素描
2019/11/13 Python
Django-migrate报错问题解决方案
2020/04/21 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
管理部部长岗位职责
2013/12/05 职场文书
优秀毕业生自荐信范文
2014/01/01 职场文书
电大本科自我鉴定
2014/02/05 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
学校证明范文
2015/06/24 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL