http://va-carousel.xiaoshang.onlinevue
Githubnode
4.1 除去可從父組件接收的屬性,組件自身有如下屬性:git
data() { return { list: [], // 當前顯示的圖片列表 hover: false, // 鼠標是否懸浮在組件上 timer: null, // 自動切換的 setInterval itemWidth: '',// 每項元素的寬度 isReverse: false // 是不是反向切換,觸發prev時,該屬性爲true } }
4.2 組件掛載以前github
beforeMount() { this.itemWidth = 100 / this.total + '%' this.list = this.items.slice(0, this.total) },
4.3 組件掛在後,檢查autoplay屬性,若該屬性爲true,則產生一個計時器vue-cli
mounted() { if (this.autoplay) { this.startTimer() } },
4.4 startTimer函數很簡單,就是間隔必定時間觸發一次next(向後)切換npm
// 開始計時器 startTimer() { if (!this.interval || this.interval <= 0) { return } this.timer = setInterval(this.next, this.interval) }
4.5 next函數json
// 下一張 next() { // 若是圖片列表小於須要顯示的數量,則不進行滾動 if (this.items.length < this.total) { return } // 向後追加一個元素,該元素爲: // 顯示列表中最後一個元素在原數組中的後一個元素 // 若是已是最後一個元素,則使用第一個元素 let indexOfItems = this.items.findIndex( item => item.id === this.list[this.list.length - 1].id ) if (indexOfItems === this.items.length - 1) { // 使用第一個元素 this.list.push(this.items[0]) } else { // 使用後一個元素 this.list.push(this.items[indexOfItems + 1]) } // 移除當前顯示圖片中的第一個 this.list.shift() this.isReverse = false },
4.6 對應的還有一個prev函數,與next函數邏輯相反,這裏就不展現代碼了數組
4.7 點擊圖片時,向父組件釋放事件selectedItem,傳遞兩個參數 item 和 index 分別爲當前點擊的對象,和該對象在list中的位置框架
// 點擊圖片 selectedItem(item, index) { this.$emit('selectedItem', item, index) },
4.8 鼠標懸浮在組件上時,中止自動切換(若autoplay爲ture), 鼠標離開時,繼續切換函數
handleMouseEnter() { this.hover = true this.pauseTimer() }, handleMouseLeave() { this.hover = false if (this.autoplay) { this.startTimer() } },
4.9 而後是過渡效果的實現
由於arrow元素也在transition-group中,因此當arrow=‘hover’時,arrow的顯示、隱藏也會觸發鉤子函數,可是咱們的鉤子函數是針對image-item寫的,因此須要在函數中檢測是哪一個元素觸發的,這裏經過檢查className進行判斷。
而後針對向前、向後兩種狀況設置不一樣的樣式
beforeEnter(el) { // 只對image-item使用過渡 let isImageItem = el.className.indexOf('image-item') > -1 if (isImageItem) { el.style.opacity = 0 if (this.isReverse) { el.style.transform = 'translateX(-100%)' } else { el.style.transform = 'translateX(100%)' } } }
4.10 這裏使用了Velocity,這是一個實現動畫效果的js庫,之因此使用這個庫是由於試了n種方案都沒能實現預期效果emm
enter(el, done) { // 只對image-item使用過渡 let isImageItem = el.className.indexOf('image-item') > -1 if (isImageItem) { Velocity(el, { opacity: 1, translateX: '0px' }, { complate: done }) } else { done() } }
4.11 而後是對應的beforeLeave、leave函數,這裏就不展現了
以上基本就是全部js部分,總體感覺就是,一旦實現邏輯搞清楚,代碼實現起來仍是挺容易的,而後就是框架的熟悉程度。
這本是公司業務中的一個功能需求,由於沒能在網上找到現成的輪子,找個差很少的效果領導不滿意,因此只能本身寫了,作都作了不發出來豈不是白寫了. . .
npm發佈流程簡單歸納就是
1.註冊
去npm官網註冊個帳號
2.生成npm包 文件夾中有package.json文件就是一個npm包
3.在終端使用npm publish發佈包,成功以後,該項目文件夾下全部文件都會上傳至npm官網,當用戶使用npm install安裝後,就會將整個文件夾下載至node_modules文件夾中,對於這個項目,就是一個使用vue-cli生成的vue項目,組件路徑src/components/VaCarousel.vue
,因此使用npm install va-carousel安裝以後,只須要在項目中像這樣導入便可使用(前提是你的項目也是使用vue-cli生成的,對於其餘方式創建的項目可能會出現一些錯誤):import VaCarousel from 'va-carousel/src/components/VaCarousel.vue'
以上