#上拉加载与下拉刷新
#⏬ 插件下载
- jQuery-mescroll 插件:jq-mescroll.7z
#HTML 页面示例
代码示例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>title-list</title>
<!-- 重置样式 -->
<link rel="stylesheet" type="text/css" href="css/reset.min.css" />
<!-- 插件封装样式 -->
<link rel="stylesheet" type="text/css" href="css/mescroll.min.css" />
<!-- 当前页面css样式 -->
<link rel="stylesheet" type="text/css" href="css/list.css" />
</head>
<body>
<div class="header">
<!-- 列表标题 -->
<p style="line-height:24px;">列表标题名称</p>
<!-- 列表表头 -->
<div class="nav">
<p class="active" i="0">分类0</p>
<p i="1">分类1</p>
<p i="2">分类2</p>
</div>
</div>
<!-- 内容滑动区 -->
<div id="mescroll" class="mescroll">
<ul id="dataList" class="data-list"></ul>
</div>
</body>
<script src="js/zepto.min.js"></script>
<!-- 插件封装js -->
<script src="js/mescroll.min.js"></script>
<!-- 当前页面js -->
<script src="js/list.js"></script>
</html>#CSS 样式示例
代码示例
* {
margin: 0;
padding: 0;
-webkit-touch-callout: none;
-webkit-user-select: none;
-webkit-tap-highlight-color: transparent;
}
body {
background-color: #fff;
}
ul {
list-style-type: none;
}
a {
text-decoration: none;
color: #18b4fe;
}
.header {
z-index: 999;
position: fixed;
top: 0;
left: 0;
width: 100%;
line-height: 16px;
padding-top: 12px;
text-align: center;
background-color: #fff;
}
.header .nav {
margin-top: 12px;
border-bottom: 1px solid #ddd;
}
.header .nav p {
display: inline-block;
width: 30%;
padding: 5px 0;
}
.header .nav .active {
color: #ffa54c;
border-bottom: 1px solid #ffa54c;
}
.mescroll {
position: fixed;
top: 84px;
bottom: 0;
height: auto;
}
.data-list li {
position: relative;
padding: 10px 8px 10px 120px;
border-bottom: 1px solid #eee;
}
.data-list .pd-img {
width: 80px;
height: 80px;
position: absolute;
top: 50%;
left: 18px;
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
.data-list .pd-name {
font-size: 16px;
height: 32px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.data-list .pd-price {
color: #333;
line-height: 18px;
font-size: 14px;
}
.data-list .pd-sold {
font-size: 12px;
margin-top: 8px;
color: gray;
}#JavaScript 逻辑示例
代码示例
$(function () {
// 获取地址栏参数
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"),
r = window.location.search.substr(1).match(reg);
return r ? decodeURI(r[2]) : null;
}
// 初始化mescroll
var mescroll = new MeScroll("mescroll", {
up: {
callback: getListData,
noMoreSize: 4,
// 没有数据时候的提示
empty: {
icon: "../res/img/mescroll-empty.png",
btntext: "暂无数据",
btnClick: function () {},
},
clearEmptyId: "dataList",
},
});
/*初始化菜单*/
var pdType = 0;
$(".nav p").click(function () {
var i = $(this).attr("i");
if (pdType != i) {
pdType = i;
$(".nav .active").removeClass("active");
$(this).addClass("active");
mescroll.resetUpScroll();
}
});
/* 链接跳转 */
$("#dataList").on("click", "li", function (e) {
// 通过事件委托实现获取每一个列表的数据,并实现跳转
window.location.href = "index.html";
});
function getListData(page) {
getListDataFromNet(
pdType,
page.num,
page.size,
function (data) {
// 对请求的数据进行判断处理
mescroll.endSuccess(data.length);
setListData(data);
},
function () {
mescroll.endErr();
}
);
}
// DOM拼接渲染
function setListData(data) {
var $dataList = $("#dataList");
// 列表项字符串拼接
for (var i = 0, str = ""; i < data.length; i++) {
let pd = data[i];
str +=
'<li data-id="' +
pd.id +
'" data-url="' +
pd.videoUrl +
'"><img class="pd-img" src="' +
pd.imgUrl +
'"/><p class="pd-name">' +
pd.videoName +
'</p><p class="pd-price">' +
pd.desc +
'</p><p class="pd-sold">浏览量:' +
pd.number +
"</p></li>";
}
$dataList.append(str);
}
function getListDataFromNet(
pdType,
pageNum,
pageSize,
successCallback,
errorCallback
) {
const api = "api_url";
// 定时器的作用是模拟网络延迟
setTimeout(function () {
$.ajax({
type: "POST",
url: api,
data: {
pageIndex: pageNum, // pageNum默认值为1
type: pdType, // type类型
},
success: function (res) {
if (res.code) {
let data = res.data;
// 请求成功回调
successCallback(data);
} else {
// 请求失败提示
mescroll.endErr();
}
},
error: function (err) {
// 请求失败回调
mescroll.endErr();
},
});
}, 500);
}
});#vue-infinite-scroll 无限滚动插件
基于 Element UI / vue-infinite-scroll 的指令式无限加载方案。
#使用场景
在处理无限加载的数据列表时,无论是 PC Web 端还是 Mobile 移动端,皆会涉及数据滚动加载问题。首先无限加载的功能需要检测到数据展示区域滚动到某一个区域或者高度才会触发事件加载机制,从而触发下一页数据的加载,直至当前数据全部加载完成,再次滚动到指定区域时,依据加载完成状态做数据的拦截处理。
#安装插件
代码示例
yarn add vue-infinite-scroll --save
// or
npm install vue-infinite-scroll --save
// or
pnpm install vue-infinite-scroll --save
// or
bun install vue-infinite-scroll --save提示
具体使用方法请查看 npmjs vue-infinite-scroll;npmmirror 访问地址:vue-infinite-scroll
#引用插件
代码示例
// 全局引用
import infiniteScroll from "vue-infinite-scroll";
Vue.use(infiniteScroll);
// 局部引用
import infiniteScroll from "vue-infinite-scroll";
new Vue({
directives: { infiniteScroll },
});#属性配置
- elementUI InfiniteScroll 文档
| infinite-scroll-disabled | Boolean | false | true/false | 否 | 禁用滚动加载 |
| infinite-scroll-distance | Number | 0 | - | 否 | 滚动距离 |
| infinite-scroll-immediate | Boolean | true | true/false | 否 | 滚动加载时是否立即执行 |
| infinite-scroll-delay | String | bottom | top/bottom | 否 | 节流时延,单位为 ms |
- vue-infinite-scroll 文档
| infinite-scroll-disabled | Boolean | false | true/false | 否 | 禁用滚动加载 |
| infinite-scroll-distance | Number | 0 | - | 否 | 滚动距离 |
| nfinite-scroll-immediate-check | Boolean | true | true/false | 否 | 在绑定容器后立即检查,若高度不够,无法填满可滚动容器 |
| infinite-scroll-delay | String | bottom | top/bottom | 否 | 节流时延,单位为 ms |
| infinite-scroll-listen-for-event | Function | 否 | infinite scroll 会在 Vue 实例中发出事件时再次检查。 |
#代码实例
代码示例
<template>
<article v-load="loading">
<ul v-infinite-scroll="dataLoad" infinite-scroll-disabled="noMore">
<li v-for="item in list" :key="item.value">{{ item.name }}</li>
</ul>
</article>
</template>
<script>
export default({
data(){
loading: false,
list: [],
pageNo: 0,
pageTotal: 0
},
computed:{
noMore(){
return this.pageNo ? this.pageTotal > this.list.length : false;
}
},
methods:{
// 数据加载
dataLoad(){
this.loading = true;
this.pageNo++;
getMoreData(this.pageNo).then(res => {
let {list, total} = res.data;
if(this.pageNo === 1){
this.pageTotal = total || 0;
if(this.list.length) this.list.splice(0);
}
this.list.push(...(list || []));
})
.catch(err => {
console.log('error', err);
})
.finally(() => {
this.loading = false;
});
}
}
})
</script>#CSS 样式
代码示例
article {
height: 400px;
overflow: hidden;
overflow-y: auto;
}注意事项
- 「infinite-scroll-disabled」:禁用滚动加载,默认为 false,当为 true 时,滚动加载将不会触发;
- 加载完成数据需要禁用滚动加载;此处传值为 Boolean 类型,但此处不能使用 vue 的 v-bind 进行数据绑定,否则无效;
- 包裹滚动加载数据的区域,需要限制高度!!!