You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

306 lines
8.2 KiB

<template>
<section :class="['tw-relative xl:tw-max-w-[1246px] xl:tw-mx-auto']">
<div class="tw-relative tw-grid tw-grid-cols-2 tw-gap-[10px] tw-float-right tw-top-[4px]">
<div :class="[
'swiper-button-prev highlightExhibitions tw-relative tw-text-black tw-w-[40px] tw-h-[40px] tw-left-0 tw-text-center tw-border-solid tw-border tw-border-neutrals-300 tw-rounded-[10px] tw-p-[8px] tw-hidden md:tw-block',
]"></div>
<div :class="[
'swiper-button-next highlightExhibitions tw-relative tw-text-black tw-w-[40px] tw-h-[40px] tw-right-0 tw-text-center tw-border-solid tw-border tw-border-neutrals-300 tw-rounded-[10px] tw-p-[8px] tw-hidden md:tw-block',
]"></div>
</div>
<div class="swiper-container highlightExhibitions" ref="highlightExhibitions">
<div :class="[
'swiper-wrapper tw-grid tw-grid-cols-2 tw-gap-y-[25px] md:tw-flex md:tw-grid-cols-none md:tw-gap-0',
]">
<template v-for="(item, index) in exhibitions">
<div :key="index" :class="['swiper-slide']" v-if="index <= useSwiper">
<skeletonSlot>
<template #default>
<hightlightExhibitionsCard :item="item"></hightlightExhibitionsCard>
</template>
<template #fallback>
<sk></sk>
</template>
</skeletonSlot>
</div>
</template>
<template v-for="n in exhibitionsLength" >
<div :key="n" :class="['swiper-slide']" v-if="windewWidth >= 1366">
</div>
</template>
</div>
</div>
<a class="tw-block tw-border tw-border-solid tw-text-black tw-text-center tw-border-black tw-bg-white tw-py-[9px] tw-w-full tw-rounded-[12px] tw-mt-[44px] md:tw-hidden"
:href="localePath('/exhibition')">
{{ $t("See more") }}
</a>
</section>
</template>
<script>
import { dateCountDown } from "~/utils/assist";
import skeletonSlot from "~/components/newComponent/skeleton/skeletonSlot.vue";
import hightlightExhibitionsCard from "~/components/home/HightlightExhibitionsCard.vue";
import sk from '~/components/newComponent/skeleton/homeExhibitionCardSkeleton.vue';
import TrendingServiceVue from "./TrendingService.vue";
import Swiper from "swiper/bundle";
export default {
components: {
hightlightExhibitionsCard,
sk,
skeletonSlot,
Swiper
},
data() {
return {
highlightExhibitionsSwiper: undefined,
carousel: 0,
carouselPagesNum: 3,
exhibitions: [],
windewWidth: "",
};
},
async created() {
// await this.getData();
this.exhibitions = [
{
id: '1',
name: 'VISA',
logo: require('/assets/img/thems/Frame33.png'),
startdate: '2023-03-01',
enddate: '2023-03-30',
region:{
name: 'Vietnam'
},
country:{
name: 'Vietnam'
},
city:{
name: 'Vietnam'
}
},
{
id: '1',
name: 'VISA',
logo: require('/assets/img/thems/Frame33.png'),
startdate: '2023-03-01',
enddate: '2023-03-30',
region:{
name: 'Vietnam'
},
country:{
name: 'Vietnam'
},
city:{
name: 'Vietnam'
}
},{
id: '1',
name: 'VISA',
logo: require('/assets/img/thems/Frame33.png'),
startdate: '2023-03-01',
enddate: '2023-03-30',
region:{
name: 'Vietnam'
},
country:{
name: 'Vietnam'
},
city:{
name: 'Vietnam'
}
}
];
if (process.browser) {
window.addEventListener("resize", this.handleResize);
}
this.handleResize();
},
mounted() {
let vm = this;
vm.$nextTick(function () {
vm.initSwiper();
});
},
destroyed() {
if (process.browser) {
window.removeEventListener("resize", this.handleResize);
}
},
computed: {
useSwiper() {
if (this.windewWidth < 768) {
return 5;
} else {
return this.exhibitions.length;
}
},
exhibitionsLength() {
if (this.exhibitions.length > 6 && this.exhibitions.length < 12) {
return 12 - this.exhibitions.length;
}
if (this.exhibitions.length > 9 && this.exhibitions.length < 18) {
return 18 - this.exhibitions.length;
}
},
},
methods: {
async getData() {
let langQuery = "?lang=" + this.$i18n.localeProperties["langQuery"] + "&";
this.$axios
.get("/trending/exhibitions" + langQuery)
.then((res) => {
this.exhibitions = res.data.exhibitions;
this.exhibitions = this.exhibitions.filter((item) => {
let day = this.dateCountDown(item.startdate);
return day > 0;
})
})
.catch((err) => {
console.error(err);
});
},
handleResize() {
if (process.browser) {
this.windewWidth = window.innerWidth;
this.initSwiper();
}
},
initSwiper() {
let vm = this;
vm.$nextTick(function () {
vm.highlightExhibitionsSwiper = new Swiper(
".swiper-container.highlightExhibitions",
{
direction: "horizontal",
initialSlide: 0,
slidesPerView: 2,
slidesPerColumn: 3,
// slidesPerGroup: 3,
slidesPerColumnFill: 'row',
allowTouchMove: false,
grabCursor: true,
observer: true, //修改swiper自己或子元素时,自动初始化swiper
observeParents: true, //修改swiper的父元素时,自动初始化swiper
rebuildOnUpdate: true,
preloadImages: false,
spaceBetween: 10,
lazy: {
loadPrevNext: true,
loadOnTransitionStart: true,
loadPrevNextAmount: 6,
},
navigation: {
prevEl: ".swiper-button-prev.highlightExhibitions",
nextEl: ".swiper-button-next.highlightExhibitions",
},
breakpoints: {
768: {
slidesPerView: 1,
slidesPerColumn: 6,
slidesPerGroup: 1,
spaceBetween: 20,
allowTouchMove: true,
lazy: {
loadPrevNext: true,
loadOnTransitionStart: true,
loadPrevNextAmount: 10,
},
},
1366: {
slidesPerView: 2,
slidesPerColumn: 3,
slidesPerGroup: 2,
spaceBetween: 20,
slidesPerColumnFill: 'row',
allowTouchMove: true,
},
},
}
);
vm.highlightExhibitionsSwiper.init();
vm.highlightExhibitionsSwiper.update();
});
},
dateCountDown
},
};
</script>
<style lang="scss" scoped>
.swiper-container {
width: 100% !important;
}
.swiper-slide {
margin-right: 20px;
// @media screen and (min-width:768px) {
// &:first-child {
// margin-bottom: 20px;
// }
// }
}
.swiper-button {
&-prev.highlightExhibitions {
z-index: 4;
&:focus-visible {
outline: none;
}
&::after {
font-size: 24px;
font-weight: bold;
text-align: center;
color: transparent;
background-image: url('~/assets/svg/u-angle-left-b.svg');
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
&:focus-visible,
&:focus {
outline: none;
}
}
&-next.highlightExhibitions {
z-index: 4;
&:focus-visible {
outline: none;
}
&::after {
font-size: 24px;
font-weight: bold;
text-align: center;
color: transparent;
background-image: url('~/assets/svg/u-angle-right-b.svg');
background-position: center;
background-repeat: no-repeat;
background-size: cover;
}
&:focus-visible,
&:focus {
outline: none;
}
}
}
.active {
position: relative;
&::after {
content: "";
display: block;
position: absolute;
bottom: -12px;
width: 100%;
height: 2px;
background-color: #f48800;
}
}
</style>