安装
npm install --save mescroll.js //不要使用cnpm安装, 因为更新下来有可能是旧的版本
随便起一个test.vue 拷贝下面代码
<template>
<div>
<ul class="tab">
<li
v-for="(item, index) in [0, 1]"
:key="'x' + index"
:class="curtIndex === index ? 'curt' : ''"
@click="checkd"
>
{{ item }}
</li>
</ul>
<!--mescroll滚动区域的基本结构-->
<mescroll-vue
ref="mescroll"
:down="mescrollDown"
:up="mescrollUp"
@init="mescrollInit"
>
<ul v-if="curtIndex === 0">
<li
v-for="item in dataList"
:key="item.id"
>{{ item.title }}</li>
</ul>
<ul v-else>
<li
v-for="item in dataList2"
:key="item.id"
>{{ item.title }}</li>
</ul>
</mescroll-vue>
</div>
</template>
<script>
// 引入mescroll的vue组件
import MescrollVue from "mescroll.js/mescroll.vue";
export default {
components: {
MescrollVue // 注册mescroll组件
},
data () {
return {
curtIndex: 0,
mescroll: null, // mescroll实例对象
mescrollDown: {}, //下拉刷新的配置. (如果下拉刷新和上拉加载处理的逻辑是一样的,则mescrollDown可不用写了)
mescrollUp: {
// 上拉加载的配置.
callback: this.upCallback, // 上拉回调,此处简写; 相当于 callback: function(page, mescroll) { }
//以下是一些常用的配置,当然不写也可以的.
page: {
num: 0, //当前页 默认0,回调之前会加1; 即callback(page)会从1开始
size: 10 //每页数据条数,默认10
},
htmlNodata: '<p class="upwarp-nodata">-- END --</p>',
noMoreSize: 5, //如果列表已无数据,可设置列表的总数量要大于5才显示无更多数据;
// 避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
// 这就是为什么无更多数据有时候不显示的原因
toTop: {
//回到顶部按钮
src: "./static/mescroll/mescroll-totop.png", //图片路径,默认null,支持网络图
offset: 1000 //列表滚动1000px才显示回到顶部按钮
},
empty: {
//列表第一页无任何数据时,显示的空提示布局; 需配置warpId才显示
warpId: "xxid", //父布局的id (1.3.5版本支持传入dom元素)
icon: "./static/mescroll/mescroll-empty.png", //图标,默认null,支持网络图
tip: "暂无相关数据~" //提示
}
},
dataList: [], // 列表数据
dataList2: [] // 列表2数据
};
},
beforeRouteEnter (to, from, next) {
// 如果没有配置顶部按钮或isBounce,则beforeRouteEnter不用写
next(vm => {
// 滚动到原来的列表位置,恢复顶部按钮和isBounce的配置
vm.$refs.mescroll && vm.$refs.mescroll.beforeRouteEnter();
});
},
beforeRouteLeave (to, from, next) {
// 如果没有配置顶部按钮或isBounce,则beforeRouteLeave不用写
// 记录列表滚动的位置,隐藏顶部按钮和isBounce的配置
this.$refs.mescroll && this.$refs.mescroll.beforeRouteLeave();
next();
},
methods: {
checkd (e) {
const index = +e.target.innerText;
console.log(index);
this.curtIndex = index;
this.dataList = []; // 在这里手动置空列表,可显示加载中的请求进度
this.dataList2 = []; // 在这里手动置空列表,可显示加载中的请求进度
this.mescroll.resetUpScroll();
},
// mescroll组件初始化的回调,可获取到mescroll对象
mescrollInit (mescroll) {
this.mescroll = mescroll; // 如果this.mescroll对象没有使用到,则mescrollInit可以不用配置
},
// 上拉回调 page = {num:1, size:10}; num:当前页 ,默认从1开始; size:每页数据条数,默认10
upCallback (page, mescroll) {
const self = this;
// 联网请求
setTimeout(() => {
// 请求的列表数据
let arr = [];
for (let i = 0; i < 20; i += 1) {
arr.push({
id: i,
title: `test${i}`
});
}
// 如果是第一页需手动置空列表
if (self.curtIndex === 0) {
if (page.num === 1) self.dataList = [];
// 把请求到的数据添加到列表
self.dataList = self.dataList.concat(arr);
} else {
if (page.num === 1) self.dataList2 = [];
// 把请求到的数据添加到列表
self.dataList2 = self.dataList2.concat(arr);
}
if (self.mescrollUp.page.num === 2) {
mescroll.endSuccess(arr.length, false);
return false;
}
// 数据渲染成功后,隐藏下拉刷新的状态
self.$nextTick(() => {
mescroll.endSuccess(arr.length);
});
}, 1000);
}
}
};
</script>
<style scoped>
/*通过fixed固定mescroll的高度*/
.mescroll {
position: fixed;
top: 44px;
bottom: 0;
height: auto;
font-size: 36px;
}
.tab {
font-size: 36px;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.tab > li {
width: 50%;
height: 30px;
background: yellow;
list-style: none;
border-right: 1px solid;
}
.curt {
color: red;
}
</style>