Vue無限滑動周選擇日期的組件的示例代碼
之前在做一個手機(jī)端項目的時候,需要一個左右滑動(按周滑動)選擇日期插件,而且當(dāng)時這個項目沒有用到Vue。當(dāng)時又沒有找到合適的第三方插件,就花了點時間用原生JavaScript寫了出來,當(dāng)時心中就想把它寫成基于Vue的組件,這短時間閑了把它弄出來了!,在這個過程中遇到了一個坑,后面會提出來!
先看效果

思路
根據(jù)用戶傳入日期(不傳默認(rèn)今天),獲取上一周,當(dāng)周,下一周對應(yīng)的日期放數(shù)組dates里
let vm = this
this.dates.push(
{
date: moment(vm.defaultDate).subtract(7, 'd').format('YYYY-MM-DD'),
},
{
date: vm.defaultDate,
},
{
date: moment(vm.defaultDate).add(7, 'd').format('YYYY-MM-DD'),
}
)
根據(jù)datas 生成每一周對應(yīng)的日期
getDaies (date) {
let vm = this,
arr = []
let weekOfDate = Number(moment(date).format('E'))
let weeks = ['日', '一', '二', '三', '四', '五', '六']
let today = moment()
let defaultDay = moment(vm.defaultDate)
for (var i = 0; i < 7; i++) {
let _theDate = moment(date).subtract(weekOfDate - i, 'd')
arr.push({
date: _theDate.format('YYYY-MM-DD'),
week: weeks[i],
isToday: _theDate.format('YYYY-MM-DD') === today.format('YYYY-MM-DD'),
isDay: _theDate.format('E') === defaultDay.format('E')
})
}
return arr
}
生成每一個滑動單元的style
getTransform (index) {
let vm = this
let style = {}
if (index === vm.activeIndex) {
style['transform'] = 'translateX('+ vm.distan.x +'px)'
}
if (index < vm.activeIndex) {
style['transform'] = 'translateX(-100%)'
}
if (index > vm.activeIndex) {
style['transform'] = 'translateX(100%)'
}
style['transition'] = vm.isAnimation ? 'transform 0.5s ease-out' : 'transform 0s ease-out'
return style
}
然后就是處理touchstart touchend touchmove事件了,這里就不貼代碼了,說下邏輯:
- ouchstart 記錄滑動起點位置
- touchmove 獲得滑動距離賦值給 vm.distan.x 實時獲得當(dāng)前周transform
- touchend 改變activeIndex的值,當(dāng)然改變activeIndex的值是不夠的,要實現(xiàn)無限滑動,就要在操作一下dates,如果是左滑刪除dates的第一個元素并且往dates里面push下下周對應(yīng)日期,如果是右滑刪除最后一個元素并網(wǎng)數(shù)組前面unshift上上周對應(yīng)的日期
坑點
因為這個組件是通過css3的transition來實現(xiàn)動畫的,最開始我是把所用三個滑動元素在css里面寫了transition:transform 0.5s ease-out; 誰知道自己把自己坑了,因為最后我們改變activeIndex后要刪除一個日期,還要往數(shù)組里面新增一個元素,這樣就會引起dates的改變,進(jìn)而引起Vue去重新更新界面,導(dǎo)致動畫又出來了!最后想到的解決辦法就是引入一個變量isAnimation來控制transition的值,只有當(dāng)滑動的時才開啟過度動畫效果,再偵聽transitionend時間重置isAnimation = false后再更新dates
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue中關(guān)于this.refs為空出現(xiàn)原因及分析
這篇文章主要介紹了vue中關(guān)于this.refs為空出現(xiàn)原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
Composition API思想封裝NProgress示例詳解
這篇文章主要為大家介紹了Composition API思想封裝NProgress示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
element-ui 表格實現(xiàn)單元格可編輯的示例
下面小編就為大家分享一篇element-ui 表格實現(xiàn)單元格可編輯的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
vue里的axios如何獲取本地json數(shù)據(jù)
這篇文章主要介紹了vue里的axios如何獲取本地json數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
vue任意關(guān)系組件通信與跨組件監(jiān)聽狀態(tài)vue-communication
這篇文章主要介紹了vue任意關(guān)系組件通信與跨組件監(jiān)聽狀態(tài)vue-communication,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
利用Vite2和Vue3實現(xiàn)網(wǎng)站國際化的全過程
vite2已經(jīng)出來一段時間了,最近沒忍住嘗試了一下,這篇文章主要給大家介紹了關(guān)于利用Vite2和Vue3實現(xiàn)網(wǎng)站國際化的相關(guān)資料,需要的朋友可以參考下2021-08-08

