vuejs+mui实现移动端上拉加载更多

89 阅读2分钟

对mui框架里面的上拉加载更多方法进行改造,能实现结合vuejs使用

MUI 组件地址:

https://dev.dcloud.net.cn/mui/ui/

html结构

<div id="dataList" class="testdata">
	<!--这个div不可缺,滚动容器-->
   <div>
		<ul id="showdata" class="tablelist">
			<li v-for="(item,index) in dataList" :key="'a'+index">{{item.name}}</li>
		</ul>
    </div>
</div>

css样式

.testdata {
    position: absolute;
    top: 128px;/*上面banner的高度*/
    left: 0;
    width: 100%;
}
.tablelist li {
    position: relative;
    padding: 0 10px;
    height: 44px;
    line-height: 44px;
    display: flex;
    text-align: center;
    align-items: center;
    color: #333;
    box-sizing: border-box;
}
/*列表底部边框移动端1px细边框*/
.tablelist li::after {
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
    height: 1px;
    content: '';
    -webkit-transform: scaleY(.5);
    transform: scaleY(.5);
    background-color: #c8c7cc;
}

js

var vm = new Vue({
		el: '#app',
		data: {
			dataList:null,//分页请求后得到的数据
			pageNum:1,//当前页码
			pageSize:10,//总条数
			isOver:false,//状态标识 是否加载完数据
			_startLimit:10//实际请求条数
		},
		methods:{
			initPull(){
				// 列表上拉加载
				this._startLimit = this.pageNum*this.pageSize;
				var _self = this;
				mui.init({
				  pullRefresh : {
				    container:'#dataList',
				    up : {
				      height:50,//可选.默认50.触发上拉加载拖动距离
				      auto:true,//可选,默认false.自动上拉加载一次
				      contentrefresh : "正在加载...",//可选,正在加载状态时,上拉加载控件上显示的标题内容
				      contentnomore:'没有更多数据了',//可选,请求完毕若没有更多数据时显示的提醒内容;
				      callback :function(){
						setTimeout(function() {
							mui('#dataList').pullRefresh().endPullupToRefresh((_self.isOver));
							_self.pullUpfresh();
							console.log(2)
						}, 500);
						} 
				    }
				  }
				});
			},
			pullUpfresh(){
				var para = {
					"city":'长沙市',
					"status": 0,
					"newType": 2,
					"page": this.pageNum,
					"rows": this._startLimit
				}
				//这里请求使用了axios 和Qs需要引入插件 改成jq 的ajax 一样,就是数据请求接口
				axios({
					url: baseurl+ '/site/getSiteByCondition',
					method: 'post',
					data: Qs.stringify(para)
				}).then(res => {
					if (res.data.statusCode == "200") {
						this.dataList = res.data.rows;
						//判断当前页码是否与最大页码数一致,如果一致则标识为true
						var maxPage = Math.ceil(res.data.total/this.pageSize);
						if(this.pageNum==maxPage){
							this.isOver = true;
						}
						//请求下一页做准备
						if(this.isOver == false){
							this.pageNum++;
						}
					}else{
						mui.toast(res.data.message);
					}
				})	
			}
		},
		created(){
			this.initPull();
		}

vue实现移动端上拉加载更多

### 注意:容器必须要有固定的高度
 <!-- 容器 -->
 <div ref="cont" @scroll.passive="scrollEvent"></div>

js

export default {
  name: "Demo",
  data() {
    return {
        flag :0,    // 定义一个flag变量 充当节流阀
        wait:1000,    // 定义一个wait变量 延迟多长时间触发
    };
  },
  methods: {
    // 滚动事件
    scrollEvent() {
      // 获取容器盒子的dom
      let cont= this.$refs.cont;
      // 判断滚动条距离容器底部的位置 当滚动条距离容器底部只有5像素时触发
      if (cont.scrollHeight - cont.scrollTop - 5 <= cont.clientHeight) {
        if (flag) return;
        flag = 1; // 执行完一次后 关闭节流阀
 
        // setTimeout 根据个人需求来定 
        setTimeout(() => {
          // 需要执行的操作 执行完成后开启节流阀flag = 0;
          // 如果不需要在进行操作 flag无需改变或者flag = 1;
        }, wait);
      }
    },
  },
};