vue+swiper,怎么在轮播图中插入背景图,使其占满整个屏幕
目前页面出现的问题如图,占满不了整个屏幕
代码展示
建议用F12
打开控制台查看元素定位问题,前端查找问题,控制台用处很大。
①安装swiper : cnpm install --save swiper@5
②引入 css和js文件和js代码段
import Swiper from'swiper'
import "swiper/css/swiper.css"
js代码段放在mounted里面。
但是这样做以后会发现没有效果,为什么呢?因为我们遇到了异步的问题
我们期待的顺序时①②③④,因为这样就能正常的渲染数据
而调试完才发现顺序是①②④③,
可以看到bannerlist数据还没回来,mounted就挂载完毕了,所以获取不到数据,关键就是dispatch方法,这是一个异步语句,导致v-for遍历的时候结构还不完全,所以我们需要解决这个问题。
我们需要用watch监听属性和$nextTick来解决这个问题
官方介绍nextTick:在下次DOM更新 循环结束之后 执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
当执行了handler方法,代表组件实例身上这个属性的属性更新了,因为一修改数据之后,watch就会检测到,然后使用nextTick方法,获取更新后的 DOM.当你执行这个回调的时候,服务器的数据回来了,v-for执行完毕了,所以轮播图的结构就一定有了。
<div class="swiper-container" ref="mySwiper">
<div class="swiper-wrapper">
<div
class="swiper-slide"
v-for="(carousel, index) in bannerList"
:key="carousel.id"
>
<img :src="carousel.imgUrl" />
</div>
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
</div>
watch: {
//监听bannerList数据的变化:因为这条数据发生过变化----由空数组变为数组里面有四个元素
bannerList: {
handler(newValue, oldValue) {
this.$nextTick(() => {
//swiper的模板
var mySwiper = new Swiper(
this.$refs.mySwiper,
{
loop: true, // 循环模式选项
// 如果需要分页器
pagination: {
el: ".swiper-pagination",
clickable: true,
},
// 如果需要前进后退按钮
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
}
);
});
},
},
},
props传递数据:
父组件Home传给子组件Floor数据
子组件接收:
floor模块继续使用swiper组件,但是这里却可以直接把js代码放在mounted中, 之前不能放在mounted中是因为在组件内部发送请求,动态渲染,这里的轮播图数据是父组件中传来的,所以可直接放在mounted中,不用使用watch+$nextTick。
mounted() {
// 之前不能放在mounted中,因为是在组件内部发送请求,动态渲染的,这里是父组件中传来的数据,所以可以直接放在mounted中,不用使用nextTick
var mySwiper = new Swiper(this.$refs.cur, {
// direction: "vertical", // 垂直切换选项
loop: true, // 循环模式选项
// 如果需要分页器
pagination: {
el: ".swiper-pagination",
clickable: true,
},
// 如果需要前进后退按钮
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
});
},