Vue無(wú)限滑動(dòng)周選擇日期的組件的示例代碼
之前在做一個(gè)手機(jī)端項(xiàng)目的時(shí)候,需要一個(gè)左右滑動(dòng)(按周滑動(dòng))選擇日期插件,而且當(dāng)時(shí)這個(gè)項(xiàng)目沒(méi)有用到Vue。當(dāng)時(shí)又沒(méi)有找到合適的第三方插件,就花了點(diǎn)時(shí)間用原生JavaScript寫(xiě)了出來(lái),當(dāng)時(shí)心中就想把它寫(xiě)成基于Vue的組件,這短時(shí)間閑了把它弄出來(lái)了!,在這個(gè)過(guò)程中遇到了一個(gè)坑,后面會(huì)提出來(lái)!
先看效果
思路
根據(jù)用戶(hù)傳入日期(不傳默認(rèn)今天),獲取上一周,當(dāng)周,下一周對(duì)應(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 生成每一周對(duì)應(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 }
生成每一個(gè)滑動(dòng)單元的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事件了,這里就不貼代碼了,說(shuō)下邏輯:
- ouchstart 記錄滑動(dòng)起點(diǎn)位置
- touchmove 獲得滑動(dòng)距離賦值給 vm.distan.x 實(shí)時(shí)獲得當(dāng)前周transform
- touchend 改變activeIndex的值,當(dāng)然改變activeIndex的值是不夠的,要實(shí)現(xiàn)無(wú)限滑動(dòng),就要在操作一下dates,如果是左滑刪除dates的第一個(gè)元素并且往dates里面push下下周對(duì)應(yīng)日期,如果是右滑刪除最后一個(gè)元素并網(wǎng)數(shù)組前面unshift上上周對(duì)應(yīng)的日期
坑點(diǎn)
因?yàn)檫@個(gè)組件是通過(guò)css3的transition來(lái)實(shí)現(xiàn)動(dòng)畫(huà)的,最開(kāi)始我是把所用三個(gè)滑動(dòng)元素在css里面寫(xiě)了transition:transform 0.5s ease-out; 誰(shuí)知道自己把自己坑了,因?yàn)樽詈笪覀兏淖僡ctiveIndex后要?jiǎng)h除一個(gè)日期,還要往數(shù)組里面新增一個(gè)元素,這樣就會(huì)引起dates的改變,進(jìn)而引起Vue去重新更新界面,導(dǎo)致動(dòng)畫(huà)又出來(lái)了!最后想到的解決辦法就是引入一個(gè)變量isAnimation來(lái)控制transition的值,只有當(dāng)滑動(dòng)的時(shí)才開(kāi)啟過(guò)度動(dòng)畫(huà)效果,再偵聽(tīng)transitionend時(shí)間重置isAnimation = false后再更新dates
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 解決antd日期選擇組件,添加value就無(wú)法點(diǎn)擊下一年和下一月問(wèn)題
- vue左右滑動(dòng)選擇日期組件封裝的方法
- Vue下拉選擇框Select組件使用詳解(二)
- Vue下拉選擇框Select組件使用詳解(一)
- 詳解vue移動(dòng)端日期選擇組件
- 基于vue2.0+vuex的日期選擇組件功能實(shí)現(xiàn)
- vue.js實(shí)現(xiàn)仿原生ios時(shí)間選擇組件實(shí)例代碼
- 基于Vue組件化的日期聯(lián)動(dòng)選擇器功能的實(shí)現(xiàn)代碼
- vue-calendar-component 封裝多日期選擇組件的實(shí)例代碼
- Ant Design封裝年份選擇組件的方法
相關(guān)文章
vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式
這篇文章主要介紹了vue截圖轉(zhuǎn)base64轉(zhuǎn)文件File異步獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue.js+Element實(shí)現(xiàn)表格里的增刪改查
本篇文章主要介紹了vue.js+Element實(shí)現(xiàn)增刪改查,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01vue element-ui v-for循環(huán)el-upload上傳圖片 動(dòng)態(tài)添加、刪除方式
這篇文章主要介紹了vue element-ui v-for循環(huán)el-upload上傳圖片 動(dòng)態(tài)添加、刪除方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue實(shí)現(xiàn)echarts中的儀表盤(pán)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)echarts中的儀表盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03vue3通過(guò)ref獲取子組件defineExpose的數(shù)據(jù)和方法
defineExpose是Vue3中新增的選項(xiàng),用于向父組件暴露子組件內(nèi)部的屬性和方法,通過(guò)defineExpose,子組件可以主動(dòng)控制哪些屬性和方法可以被父組件訪(fǎng)問(wèn),本文主要介紹了vue3通過(guò)ref獲取子組件defineExpose的數(shù)據(jù)和方法,需要的朋友可以參考下2023-10-10在?Vue?中使用?dhtmlxGantt?組件時(shí)遇到的問(wèn)題匯總(推薦)
dhtmlxGantt一個(gè)功能豐富的甘特圖插件,支持任務(wù)編輯,資源分配和多種視圖模式,這篇文章主要介紹了在?Vue?中使用?dhtmlxGantt?組件時(shí)遇到的問(wèn)題匯總,需要的朋友可以參考下2023-03-03vue3解決各場(chǎng)景l(fā)oading過(guò)度的五種方法
這篇文章主要為大家詳細(xì)介紹了vue3中解決各場(chǎng)景l(fā)oading過(guò)度的五種方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11