首先新建項目vue init webpack projectName
安裝依賴包npm i
這些就不說了
接下來就是構建咱們的swiper組件css
由於我寫的代碼不規範, 通不過eslint的檢測, 會頻繁報警告, 因此不肯意看警告的能夠打開\build\webpack.base.conf.js的32行到41行註釋掉
接下來纔開始正式的構建組件html
我直接把腳手架工具\src\components\HelloWorld.vue
下的HelloWorld組件修改成Swiper, 而後把ruter\router的HelloWorld都修改爲Swipervue
import Vue from 'vue' import Router from 'vue-router' import Swiper from '@/components/Swiper' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'Swiper', component: Swiper } ] })
<template> <div class="hello"> <p>測試</p> </div> </template> <script> export default { name: 'Swiper', data () { return { } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
npm run dev
以後看到這樣頁面就是建立成功, 能夠開始java
<template> <div class="hello"> <div class="swiper"> <img :src="imgArr[0].src" alt="" > // 綁定的屬性必定要用v-bind指令 : 是簡寫 <div> <p>{{imgArr[0].title}}</p> <span><</span> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <span>></span> </div> </div> </div> </template>
<script> export default { name: 'Swiper', props: { imgArr: { // 接受一個數組類型imgArr參數, 默認值是空數組 type: Array, default: [] } }, data () { return { } } } </script>
<template> <div id="app"> <Swiper :imgArr="imgArr"></Swiper> // 把imgArr傳遞給swipr組件 </div> </template>
<script> import Swiper from './components/Swiper.vue' // 引用swiper組件 export default { name: 'app', components : { Swiper // 聲明使用Swiper組件 }, data() { return { imgArr: [ { src:require("./images/1.jpg"), // js中引用圖片路徑必定要用require關鍵字, html和css部分不須要 title: '1.jpg' }, { src:require("./images/2.jpg"), title: '2.jpg' }, { src:require("./images/3.jpg"), title: '3.jpg' }, { src:require("./images/4.jpg"), title: '4.jpg' }, ] } } } </script>
如今的頁面應該是
接下來咱們該去寫切換邏輯部分webpack
首先是把圖片標號改爲圖片數組的長度, 不能寫死
咱們修改swiper.vue內的代碼
git
接下來是點擊編號跳轉到相應的圖片, 經過switchImg函數進行跳轉
函數就是修改當前組件的currentNum, 達到顯示哪一張圖片github
<template> <div class="hello"> <div class="swiper"> <img :src="imgArr[currentNum].src" alt="" > <div> <p>{{imgArr[currentNum].title}}</p> <span><</span> <ul> <li v-for="(item, index) in imgArr"> <a @click="switchImg(index)" href="javascripe:;">{{ index + 1 }}</a> </li> </ul> <span>></span> </div> </div> </div> </template> <script> export default { name: 'Swiper', props: { imgArr: { type: Array, default: [] } }, data () { return { currentNum:0 } }, methods: { switchImg(index) { this.currentNum = index; } } } </script>
computed: { nextNum() { if (this.currentNum === 0) { return this.imgArr.length-1 } else { return this.currentNum - 1 } }, preNum() { if (this.currentNum === this.imgArr.length-1) { return 0 } else { return this.currentNum + 1 } } }
只需上一頁下一頁的按鈕添加一樣的事件, 把以上兩個計算屬性傳入函數便可web
<span @click="switchImg(nextNum)"><a href="javascripe:;"><</a></span> <ul> <li @click="switchImg(index)" v-for="(item, index) in imgArr"> <a href="javascripe:;">{{ index + 1 }}</a> </li> </ul> <span @click="switchImg(preNum)"><a href="javascripe:;">></a></span>
interval() { this.inv = setInterval(() => { this.switchImg(this.preNum); },this.time) }
再添加一個傳入的參數, 默認值是1000(1秒)vue-router
time: { type: Number, default: 1000 }
再組件初始化完畢後開始執行npm
created() { this.interval(); }
// 清除定時器 clearTime() { clearInterval(this.inv) }, // 重啓定時器 setTime() { this.interval(); }
再最外層的div加上兩個出發函數
<div class="hello" @mouseover="clearTime" @mouseout="setTime">
autoPlay: { type: Boolean, default: true }
而後處理一下剛纔定義好的重啓定時器和初始化完畢鉤子函數
setTime() { if(this.autoPlay) { this.interval(); } } created() { if(this.autoPlay) { this.interval(); } }
此時一個簡單的swiper組件就構建完畢, 可傳入一個圖片地址數組, 一個自動播放事件, 是否自動播放三個參數
項目地址