feat: 瀑布流组件添加无限滚动

This commit is contained in:
xiaoxian521 2023-05-18 17:10:43 +08:00
parent d70b94111c
commit ca6459f224
4 changed files with 74 additions and 64 deletions

View File

@ -40,7 +40,7 @@ menus:
hsmessage: 消息提示组件
hsvideo: 视频组件
hssegmented: 分段控制器组件
hswaterfall: 瀑布流组件
hswaterfall: 瀑布流无限滚动组件
hsmap: 地图组件
hsdraggable: 拖拽组件
hssplitPane: 切割面板

View File

@ -65,6 +65,7 @@
"swiper": "^9.3.1",
"typeit": "^8.7.1",
"v-contextmenu": "3.0.0",
"v3-infinite-loading": "^1.2.2",
"vue": "^3.3.2",
"vue-i18n": "^9.2.2",
"vue-json-pretty": "^2.2.4",

9
pnpm-lock.yaml generated
View File

@ -93,6 +93,7 @@ specifiers:
typeit: ^8.7.1
typescript: ^5.0.4
v-contextmenu: 3.0.0
v3-infinite-loading: ^1.2.2
vite: ^4.3.7
vite-plugin-cdn-import: ^0.3.5
vite-plugin-compression: ^0.5.1
@ -151,6 +152,7 @@ dependencies:
swiper: 9.3.1
typeit: 8.7.1
v-contextmenu: 3.0.0_vue@3.3.2
v3-infinite-loading: 1.2.2
vue: 3.3.2
vue-i18n: 9.2.2_vue@3.3.2
vue-json-pretty: 2.2.4_vue@3.3.2
@ -11660,6 +11662,13 @@ packages:
vue: 3.3.2
dev: false
/v3-infinite-loading/1.2.2:
resolution:
{
integrity: sha512-MWJc6yChnqeUasBFJ3Enu8IGPcQgRMSTrAEtT1MsHBEx+QjwvNTaY8o+8V9DgVt1MVhQSl3MC55hsaWLJmpRMw==
}
dev: false
/v8-compile-cache-lib/3.0.1:
resolution:
{

View File

@ -2,8 +2,10 @@
import { getList } from "./api";
import error from "./error.png";
import loading from "./loading.png";
import { onMounted, reactive, ref } from "vue";
import { ElLoading } from "element-plus";
import "vue-waterfall-plugin-next/dist/style.css";
import InfiniteLoading from "v3-infinite-loading";
import { onMounted, reactive, ref, nextTick } from "vue";
import backTop from "@/assets/svg/back_top.svg?component";
import { LazyImg, Waterfall } from "vue-waterfall-plugin-next";
@ -31,8 +33,8 @@ const options = reactive({
rowPerView: 2
}
},
//
animationEffect: "animate__fadeInUp",
// https://animate.style/
animationEffect: "animate__zoomInUp",
//
animationDuration: 1000,
//
@ -53,15 +55,26 @@ const options = reactive({
const page = ref(1);
const list = ref([]);
const pageSize = ref();
const loadingInstance = ref();
/** 加载更多 */
function handleLoadMore() {
loadingInstance.value = ElLoading.service({
target: ".content",
background: "transparent",
text: "加载中"
});
getList({
page: page.value,
pageSize: pageSize.value
}).then(res => {
list.value.push(...res);
page.value += 1;
setTimeout(() => {
list.value.push(...res);
page.value += 1;
nextTick(() => {
loadingInstance.value.close();
});
}, 500);
});
}
@ -79,73 +92,60 @@ onMounted(() => {
</script>
<template>
<el-card shadow="never" class="!h-[85vh]">
<template #header>
<div class="card-header">
<span class="font-medium">
瀑布流组件采用开源的
<el-link
href="https://github.com/heikaimu/vue3-waterfall-plugin"
target="_blank"
style="margin: 0 4px 5px; font-size: 16px"
>
vue-waterfall-plugin-next
</el-link>
</span>
</div>
</template>
<el-scrollbar height="78vh" class="content">
<Waterfall :list="list" v-bind="options">
<template #item="{ item, url, index }">
<div
class="bg-gray-900 rounded-lg shadow-md overflow-hidden transition-all duration-300 ease-linear hover:shadow-lg hover:shadow-gray-600 group"
@click="handleClick(item)"
>
<div class="overflow-hidden">
<LazyImg
:url="url"
class="cursor-pointer transition-all duration-300 ease-linear group-hover:scale-105"
/>
</div>
<div class="px-4 pt-2 pb-4 border-t border-t-gray-800">
<h4 class="pb-4 text-gray-50 group-hover:text-yellow-300">
{{ item.name }}
</h4>
<div
class="pt-3 flex justify-between items-center border-t border-t-gray-600 border-opacity-50"
>
<div class="text-gray-50">$ {{ item.price }}</div>
<div>
<button
class="px-3 h-7 rounded-full bg-red-500 text-sm text-white shadow-lg transition-all duration-300 hover:bg-red-600"
@click.stop="handleDelete(item, index)"
>
删除
</button>
</div>
<el-scrollbar height="87vh" class="content">
<Waterfall :list="list" v-bind="options">
<template #item="{ item, url, index }">
<div
class="bg-gray-900 rounded-lg shadow-md overflow-hidden transition-all duration-300 ease-linear hover:shadow-lg hover:shadow-gray-600 group"
@click="handleClick(item)"
>
<div class="overflow-hidden">
<LazyImg
:url="url"
class="cursor-pointer transition-all duration-300 ease-linear group-hover:scale-105"
/>
</div>
<div class="px-4 pt-2 pb-4 border-t border-t-gray-800">
<h4 class="pb-4 text-gray-50 group-hover:text-yellow-300">
{{ item.name }}
</h4>
<div
class="pt-3 flex justify-between items-center border-t border-t-gray-600 border-opacity-50"
>
<div class="text-gray-50">$ {{ item.price }}</div>
<div>
<button
class="px-3 h-7 rounded-full bg-red-500 text-sm text-white shadow-lg transition-all duration-300 hover:bg-red-600"
@click.stop="handleDelete(item, index)"
>
删除
</button>
</div>
</div>
</div>
</template>
</Waterfall>
</div>
</template>
</Waterfall>
<div class="flex justify-center py-10">
<!-- <div class="flex justify-center py-10">
<button
class="px-5 py-2 rounded-full bg-gray-700 text-md text-white cursor-pointer hover:bg-gray-800 transition-all duration-300"
@click="handleLoadMore"
>
加载更多
</button>
</div>
</div> -->
<el-backtop
title="回到顶部"
:right="35"
:visibility-height="400"
target=".content .el-scrollbar__wrap"
>
<backTop />
</el-backtop>
</el-scrollbar>
</el-card>
<el-backtop
title="回到顶部"
:right="35"
:visibility-height="400"
target=".content .el-scrollbar__wrap"
>
<backTop />
</el-backtop>
<!-- 加载更多 -->
<InfiniteLoading :firstload="false" @infinite="handleLoadMore" />
</el-scrollbar>
</template>