目录
Swiper
综合运用,创建一个轮播组件;轮播组件的封装
Swiper静态
直接下载swiper中的js和css在静态网页中引用css和js。
下载swiper
Swiper网址 下载Swiper - Swiper中文网
下载后解压使用这如下两个文件。
引入swiper
创建目录后,把swiper的js和css文件放入。
示例如下:
简单轮播
依照官网使用示例,做一个简单的静态轮播。
示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./swiper/swiper-bundle.css">
<style>
.swiper {
width: 600px;
height: 300px;
}
</style>
</head>
<body>
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<!-- 如果需要滚动条 -->
<div class="swiper-scrollbar"></div>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script>
var mySwiper = new Swiper ('.swiper', {
direction: 'vertical', // 垂直切换选项
loop: true, // 循环模式选项
// 如果需要分页器
pagination: {
el: '.swiper-pagination',
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
// 如果需要滚动条
scrollbar: {
el: '.swiper-scrollbar',
},
})
</script>
</body>
</html>
Swiper动态
把静态轮播改为动态获取数据后,渲染swiper轮播内容。
在init函数中处理new swiper。
示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./swiper/swiper-bundle.css">
<style>
.swiper {
width: 600px;
height: 300px;
}
</style>
</head>
<body>
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<!-- 如果需要滚动条 -->
<div class="swiper-scrollbar"></div>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script>
setTimeout(()=> {
var list = ["11111", "22222", "33333"]
var newlist = list.map(item=>`<div class="swiper-slide">${item}</div>`)
var owrapper = document.querySelector(".swiper-wrapper")
owrapper.innerHTML = newlist.join('')
// dom插入完之后, new swiper
init()
}, 2000)
// 初始化 swiper
function init() {
console.log("初始化")
new Swiper ('.swiper', {
direction: 'vertical', // 垂直切换选项
loop: true, // 循环模式选项
// 如果需要分页器
pagination: {
el: '.swiper-pagination',
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
// 如果需要滚动条
scrollbar: {
el: '.swiper-scrollbar',
},
})
}
</script>
</body>
</html>
封装swiper组件
利用之前学到的生命周期来封装一个swiper组件。
引入vue
创建文件后,引入vue.js文件。
示例如下:
<script src="../lib/vue.js"></script>
封装组件
把原来的轮播使用vue封装为组件,方便调用。
示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./swiper/swiper-bundle.css">
<style>
.swiper-container {
width: 600px;
height: 300px;
}
</style>
</head>
<body>
<div id="box">
<header>导航</header>
<div class="swiper-container demo">
<div class="swiper-wrapper">
<!--<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>-->
<div class="swiper-slide" v-for="data in datalist" :key="data">
<img :src="data" alt=""/>
</div>
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
<footer>底部内容</footer>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>
new Vue({
el: '#box',
data: {
datalist:[],
},
mounted() {
// ajax
setTimeout(()=> {
this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg",
"https://tsj.youdubook.com/cover/book_cover_6.jpg",
"https://tsj.youdubook.com/cover/book_cover_265.jpg",
"https://tsj.youdubook.com/cover/book_cover_2819.jpg",
"https://tsj.youdubook.com/cover/book_cover_219.jpg"]
}, 2000)
// 此时过早
},
})
</script>
</body>
</html>
更新中实例化
异步的请求数据,直接在创建完成时去实例化轮播组件,会无法渲染列表;
因为这时dom还在diff比对获取的是空列表。需要在更新后再去实例化。
示例如下:
updated() {
console.log(document.querySelectorAll(".swiper-slide").length)
new Swiper(".demo", {
// 如果需要分页器
pagination: {
el: '.swiper-pagination',
},
loop:true,
autoplay: {
delay: 2500,
disableOnInteraction:false
}
})
}
这种写法弊端
1.无法复用
2.如果当前页面并非只有datalist,还有其他状态更新也会触发生命周期的更新阶段。
优化
对原来的写法进行优化。把轮播功能封装为轮播容器和轮播内容两个组件,在组件挂载后实例化swiper;通过vue请求并更新数据。在页面中使用组件控件和slot插槽渲染页面内容。
示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./swiper/swiper-bundle.css">
</head>
<body>
<div id="box">
<swiper>
<!--改为动态数据-->
<swiper-item v-for="data in datalist" :key="data">
<img :src="data" alt="">
</swiper-item>
</swiper>
</div>
<script src="./swiper/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>
Vue.component("swiperItem", {
template:`
<div class="swiper-slide">
<slot></slot>
</div>
`
})
Vue.component("swiper", {
template:`
<div class="swiper-container demo">
<div class="swiper-wrapper">
<slot></slot>
</div>
<div class="swiper-pagination"></div>
</div>`,
// 组件挂载后 直接示例swiper
mounted() {
new Swiper(".demo", {
// 如果需要分页器
pagination: {
el: '.swiper-pagination',
},
loop:true,
autoplay: {
delay: 2500,
disableOnInteraction:false
}
})
}
})
// vue去请求并更新数据
new Vue({
el: '#box',
data: {
datalist:[],
},
mounted() {
// ajax
setTimeout(()=> {
this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg",
"https://tsj.youdubook.com/cover/book_cover_6.jpg",
"https://tsj.youdubook.com/cover/book_cover_265.jpg",
"https://tsj.youdubook.com/cover/book_cover_2819.jpg",
"https://tsj.youdubook.com/cover/book_cover_219.jpg"]
}, 2000)
}
})
</script>
</body>
</html>
防止复用
防止swiper复用的方式。
第一种
在异步情况下swiper要增加key绑定数组长度。防止swiper复用。
示例如下:
<swiper>
<!--改为动态数据-->
<swiper-item v-for="data in datalist" :key="data">
<img :src="data" alt="">
</swiper-item>
</swiper>
第二种
通过if判断列表的长度。
示例如下:
<div id="box">
<swiper v-if="datalist.length">
<!--改为动态数据-->
<swiper-item v-for="data in datalist" :key="data">
<img :src="data" alt="">
</swiper-item>
</swiper>
</div>
增加循环
在轮播到最后一个时,需要进行循环。
在组件使用时传递属性,在加载完成时使用属性。
组件使用时传递loop属性
示例如下:
组件中接收loop属性值。
示例如下:
在组件实例化swiper时,使用传递的loop属性值。
示例如下:
对传值进行限制和设置默认值。
示例如下:
props:{
loop: {
type:Boolean,
default:true
}
},