ios風格的時間選擇插件

来源:https://www.cnblogs.com/024-faith/archive/2018/11/16/ios-timer.html
-Advertisement-
Play Games

1.起因 在上個項目中,客戶希望時間選擇插件可以是ios風格的那種,但是找了很久,發現並沒有用vue的ios風格時間插件,於是自己便自己造了一個輪子. 2.插件效果 3.插件依賴以及安裝使用 插件依賴於better-scroll和vue,安裝流程如下: 4.源碼查看與調試 可以在我的Github上查 ...


1.起因

  在上個項目中,客戶希望時間選擇插件可以是ios風格的那種,但是找了很久,發現並沒有用vue的ios風格時間插件,於是自己便自己造了一個輪子.

2.插件效果

  

 

3.插件依賴以及安裝使用

  插件依賴於better-scroll和vue,安裝流程如下:

step1:  npm install vue -D
step2:  npm install better-scroll -D
step3:  npm install vue-ios-timer -D
step4:  import vueIosTimer from 'vue-ios-timer';
step5:  vue.use(vueIosTimer); 

4.源碼查看與調試

  可以在我的Github上查看源碼,或者已經下載過插件的同學可以在node_modules/vue-ios-timer/src/packages/timer.vue中查看,需要調試源碼的同學可以將node_modules/package.json中main的value值改為src/packages/index.js,然後正常使用,其運行的代碼便是node_modules/vue-ios-timer/src/packages/timer.vue中的代碼.

5.實現思路

  1) 生成年,月,日,時,分,五個數組,根據插件屬性type(可選值有date,datetime,time)初始化timeList二維數組,並初始化初始值;

initBasicData(){

	for(let i=1900; i<=2100; i++){
		this.years.push(i+'年');
	}

	for(let i=0; i<60; i++){
		if(i>0 && i<=12){
			this.monthes.push(String(i).padStart(2,'0')+'月');
		}
		if(i>0 && i<=31){
			this.days.push(String(i).padStart(2,'0')+'日');
		}
		if(i<24){
			this.hours.push(String(i).padStart(2,'0')+'時');
		}
		this.minutes.push(String(i).padStart(2,'0')+'分');
	}
	// 當type=date並且有預設值時
	if(this.type == 'date' && this.datex){
		let y = new Date(this.datex).getFullYear();
		let m = new Date(this.datex).getMonth();
		let d = new Date(this.datex).getDate();
		this.timerSelectIndex = [y-1900, m, d-1];
	// 當type=datetime並且有預設值
	}else if(this.type == 'datetime' && this.datetimex){
		let y  = new Date(this.datetimex).getFullYear();
		let m  = new Date(this.datetimex).getMonth();
		let d  = new Date(this.datetimex).getDate();
		let h  = new Date(this.datetimex).getHours();
		let min= new Date(this.datetimex).getMinutes();
		this.timerSelectIndex = [y-1900, m, d-1, h, min];
	// 當type=time並且有預設值
	}else if(this.type == 'time' && this.timex){
		let h  = Number(this.timex.split(':')[0]);
		let min= Number(this.timex.split(':')[1]);
		this.timerSelectIndex = [h, min];
	}else{
		// 當沒有預設值的時候
		this.timerSelectIndex = [0,0,0,0,0];
	}
},
initTimeList(){
	if(this.type == 'datetime'){
		this.timeList.push(this.years);
		this.timeList.push(this.monthes);
		this.timeList.push(this.days);
		this.timeList.push(this.hours);
		this.timeList.push(this.minutes);
	}else if(this.type == 'time'){
		this.timeList.push(this.hours);
		this.timeList.push(this.minutes);
	}else {
		this.timeList.push(this.years);
		this.timeList.push(this.monthes);
		this.timeList.push(this.days);
	}
},

 

  2) 有了基礎數據,通過better-scroll初始化滾動列表,better-scroll可以開啟wheel選項,實現多列表的滾動交互,而後我們每個月的天數是有可能不一樣的,所以需要動態的改變日數組,改變的時機應該是當年份列表滾動或者月份列表滾動結束的時候;

initScroll(){
	// 迴圈初始化多個列表
	if(!this.$refs.timerWrapper){
		return
	};
	let timerWrapper = this.$refs.timerWrapper;

	for(let i=0; i<timerWrapper.children.length; i++){

		let wheel = new Bscroll(timerWrapper.children[i],{
			wheel : {
				rotate : 25,
				selectedIndex : this.timerSelectIndex[i],
				wheelWrapperClass : 'wheel-scroll',
				wheelItemClass : 'wheel-item'
			},
			probeType : 3
		});
		this.wheels.push(wheel);
	}

	// 監聽scrollEnd事件,當滾動結束以後,重新渲染天這一列
	this.wheels.forEach((wheel,i)=>{
		wheel.on('scrollEnd',(pos)=>{
			if((this.type == 'date' || this.type == 'datetime') && i != 2){
				let year    = 1900 + this.wheels[0].getSelectedIndex();
				let month   = this.wheels[1].getSelectedIndex()+1;
				let newDays = this.getDays(Number(year),Number(month));

				this.$set(this.timeList,2, newDays);
				this.wheels[2].refresh();
			}
		})
	})
},
getDays(year,month){
	// 根據年份和月份得到當月的天數
	let isLeapYear = (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); 
	let bigMonthes = [1,3,5,7,8,10,12];
	let isBigMonth = bigMonthes.indexOf(month) > -1;
	let days = [];

	for(let i=1; i<=31; i++){
		days.push(String(i).padStart(2,"0")+'日');
	};

	if(isBigMonth){
		return days;
	}else if(isLeapYear && month == 2){
		return days.splice(1,29);
	}else if(!isLeapYear && month == 2){
		return days.splice(1,28);
	}else{
		return days.splice(1,30);
	}
}

 

  3)  當用戶所有的滾動操作結束以後,這時候需要通過發送getTime事件將選擇結果暴露出去;

   getIndex(){
	// 返回選中的值
	let indexes = [],result = '';
	this.wheels.forEach(wheel=>{
		indexes.push(wheel.getSelectedIndex())
	});

	if(indexes.length == 3 || indexes.length == 5){
		indexes = indexes.map((item,i)=>{
			if(i==0){
				item = 1900 + item;
			}else if(i==1 || i==2){
				item = String(item+1).padStart(2,'0');
			}else{
				item = String(item).padStart(2,'0');
			}
			return item;
		})
	}else{
		indexes = indexes.map((item,i)=>{
			item = String(item).padStart(2,'0');
			return item;
		})
	}

	if(indexes.length == 2){
		result = indexes.join(':');
	}else if(indexes.length == 3){
		result = indexes.join('-');
	}else{
		result = `${indexes[0]}-${indexes[1]}-${indexes[2]} ${indexes[3]}:${indexes[4]}`;
	}
	
	this.showTimer = false;
	this.$emit('getTime',result);
   }

 

    更多實現細節可以去看完整源碼,以上.

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ListView與RecyclerView在在app應用非常廣泛,相對於其他的view(button textview)來說比較複雜,接下來我將講一下創建的流程以及兩者的不同。 代碼來自《第一行代碼》 秋天到了,果園大豐收了,現在著急的事情,就是把水果收集好放進倉庫里。 ListView 1. 首先 ...
  • 網上的相關教程非常多,基礎知識自行搜索即可。 習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。 參考代碼可見: "https://github.com/dashnowords/blogs/tree/master/Structure/btree" 一.二叉樹的基本知識 基 ...
  • contentEditable ———————————————————————————————————————————————————————— 功能:允許用戶編輯元素中的內容。 功能說明: 該元素必須是可以獲得滑鼠焦點的元素,而且在點擊滑鼠後要向用戶提供一個插入符號,提示用戶該元素中的內容允許編輯 ...
  • 1、html常用標簽 <pre>...</pre>:標識預定義文本 <a>是anchor的縮寫,<a>標簽定義錨點和超鏈接,<a>常與href屬性連用表示超鏈接連接地址並用target來表示打開文檔的方法:_blank表示在新視窗中打開、_parent表示在父視窗中打開、_self表示在當前視窗中打 ...
  • / Zepto v1.2.0 zepto event ajax form ie zeptojs.com/license / (function (global, factory) { if (typeof define === 'function' && define.amd) define(fun ...
  • 前面說了Bootstrap4的下載和簡單使用,現在我們接著往下學習,Bootstrap4的響應式佈局主要依靠柵格系統來實現的。面老K先來講解一下Bootstrap4的柵格系統,讓你能夠更快的瞭解Bootstrap4.(PS:更詳細的介紹請訪問原K先生的博客) Bootstrap4柵格系統 柵格系統是 ...
  • 有時候,我們需要在實例創建過程中進行一些初始化的工作,以幫助我們完成項目中更複雜更豐富的需求開發,針對這樣的需求,Vue提供給我們一系列的鉤子函數。 vue生命周期 beforeCreate 在實例初始化之後,數據觀測 (data observer) 和 event/watcher 事件配置之前被調 ...
  • 日期插件rolldate.js的使用 下載地址:http://www.jq22.com/jquery-info19834 效果: 代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...