如何封装了一个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下操作css的float属性的特殊写法
Aug 22 Javascript
jQuery 1.8 Release版本发布了
Aug 14 Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
Aug 30 Javascript
Vue中用props给data赋初始值遇到的问题解决
Nov 27 Javascript
js字符串处理之绝妙的代码
Apr 05 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 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+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
php实现上传图片文件代码
2015/07/19 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
php-fpm中max_children的配置
2019/03/15 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
办公室文员工作自我评价
2013/12/01 职场文书
中英文自我评价语句
2013/12/20 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
国培远程培训感言
2014/03/08 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
新兵入伍决心书
2015/09/22 职场文书
Python实现滑雪小游戏
2021/09/25 Python
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL