Instalación de Swiper
cnpm i -S swiper
Definiicón del componente Swiper en un cmoponente funcional
<template>
<div class="swiper-container">
<div class="swiper-wrapper">
<slot></slot>
</div>
<div class="swiper-button-prev" @click="prev"></div>
<div class="swiper-button-next" @click="next"></div>
</div>
</template>
<script>
import Swiper from 'swiper';
import 'swiper/swiper-bundle.min.css';
export default {
data() {
return {
carouselInstance: null
};
},
mounted() {
this.$nextTick(() => {
this.carouselInstance = new Swiper('.swiper-container', {
slidesPerView: 4,
loop: true,
pagination: {
el: '.swiper-pagination',
clickable: true
}
});
});
},
methods: {
prev() {
this.carouselInstance.slidePrev();
},
next() {
this.carouselInstance.slideNext();
}
},
beforeDestroy() {
if (this.carouselInstance) {
this.carouselInstance.destroy(true, true);
this.carouselInstance = null;
}
}
};
</script>
<style>
.swiper-container {
width: 100%;
height: 200px;
}
.swiper-slide {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
font-size: 18px;
background: #f5f5f5;
border-radius: 8px;
margin: 0 8px;
}
</style>
Uso del componente en una vista de detalle
<template>
<div class="film-detail">
<div class="poster">
<img v-lazy="film.poster" alt="Poster">
</div>
<SwiperComponent :key="`actors-${film.actors.length}`">
<div v-for="(actor, index) in film.actors" :key="index" class="swiper-slide">
<div>
<img :src="actor.avatarAddredd" alt="Actor" style="width: 80px; height: 80px; border-radius: 50%;">
<h6>{{ actor.name }}</h6>
</div>
</div>
</SwiperComponent>
</div>
</template>
<script>
import SwiperComponent from '@/components/SwiperContainer.vue';
import { fetchFilmDetail } from '@/api/film';
export default {
components: {
SwiperComponent
},
data() {
return {
filmId: 0,
film: { actors: [] }
};
},
created() {
// Oculta el menú inferior al entrar
this.$bus.$emit('hideBottomNav', true);
},
async mounted() {
this.filmId = this.$route.params.id;
const response = await fetchFilmDetail(this.filmId);
this.film = response.data.film;
},
beforeDestroy() {
this.$bus.$emit('showBottomNav', true);
}
};
</script>
Función de solicitud personalizada para obtener detalles del film
// Importar instancia configurada de axios
import http from '@/utils/http';
// Ruta base definida en configuraciones
import { filmDetailUrl } from '@/config/apiUrls';
export const fetchFilmDetail = (id) => {
return http.get(`${filmDetailUrl}/${id}`);
};