前言
站在用戶的角度思考問題,與客戶深入溝通,找到固始網(wǎng)站設(shè)計與固始網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋固始地區(qū)。
最近有一個說法,如果你看見某個網(wǎng)站的某個功能,你就大概能猜出背后的業(yè)務(wù)邏輯是怎么樣的,以及你能動手開發(fā)一個一毛一樣的功能,那么你的前端技能算是進(jìn)階中高級水平了。比如咱們今天要聊的這個話題:如何用Vue開發(fā)一個實時性的時間轉(zhuǎn)換指令?
接下來正文從這開始~
如上圖所示(我是截取的某技術(shù)社區(qū)首頁的部分頁面),大家看到用紅色邊框勾選中的時間文字了吧。很多網(wǎng)站發(fā)布動態(tài)的時候,都會有一個相對本機(jī)時間轉(zhuǎn)換后的相對時間。那你知道這個功能實現(xiàn)的背后原理是什么嗎?如果有興趣的,請備好瓜子,茶水,繼續(xù)往下讀。
一般在服務(wù)器的存儲時間格式是Unix時間戳,比如 2018-01-17 06:00:00的時間戳是1516140000。前端在拿到數(shù)據(jù)后,將它轉(zhuǎn)換為可持續(xù)的時間格式再顯示出來。為了顯示出實時性,在一些社交類產(chǎn)品中,甚至?xí)崟r轉(zhuǎn)換為幾秒前、幾分鐘前、幾小時前等不同的格式,因為這樣比直接轉(zhuǎn)換為年、月、日、時、分、秒,顯得對用戶更加友好,體驗更人性化。
今天,我們就來實現(xiàn)這樣一個Vue自定義指令v-time,將表達(dá)式傳入的時間戳實時轉(zhuǎn)換為相對時間。為了便于演示效果,我們初始化時定義了兩個時間。
首先來看html結(jié)構(gòu):
<div id="app" v-cloak> <div v-time="timeNow"></div> <div v-time="timeBefore"></div> </div>
以及初始化一個Vue實例:
var app = new Vue({ el:'#app', data:{ timeNow:(new Date()).getTime(), timeBefore:686219755822 } })
timeNow是目前的時間,timeBefore是一個寫死的時間:1991-09-30。
先來分析一下時間轉(zhuǎn)換的邏輯:
這樣羅列出來,邏輯就一目了然了。為了使判斷更簡單,我們這里統(tǒng)一使用時間戳進(jìn)行大小判斷。在寫指令v-time之前,需要先寫一系列與時間相關(guān)的函數(shù) ,我們聲明一個對象Time,把它們都封裝到里面。
var Time = { //獲取當(dāng)前時間戳 getUnix:function(){ var date = new Date(); return date.getTime(); }, //獲取今天0點0分0秒的時間戳 getTodayUnix:function(){ var date = new Date(); date.setHours(0); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date.getTime(); }, //獲取今年1月1日0點0分0秒的時間戳 getYearUnix:function(){ var date = new Date(); date.setMonth(0); date.setDate(1); date.setHours(0); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date.getTime(); }, //獲取標(biāo)準(zhǔn)年月日 getLastDate:function(time){ var date = new Date(time); var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); return date.getFullYear() + '-' + month + '-' + day; }, //轉(zhuǎn)換時間 getFormatTime:function(timestamp){ var now = this.getUnix(); // 當(dāng)前時間戳 var today = this.getTodayUnix(); // 今天0點的時間戳 var year = this.getYearUnix(); // 今年0點的時間戳 var timer = (now - timestamp) / 1000; // 轉(zhuǎn)換為秒級時間戳 var tip = ''; if(timer <= 0){ tip = '剛剛'; }else if(Math.floor(timer/60) <= 0){ tip = '剛剛'; }else if(timer < 3600){ tip = Math.floor(timer/60) + '分鐘前'; }else if(timer >= 3600 && (timestamp - today >= 0)){ tip = Math.floor(timer/3600) + '小時前'; }else if(timer/86400 <= 31){ tip = Math.ceil(timer/86400) + '天前'; }else{ tip = this.getLastDate(timestamp); } return tip; } }
當(dāng)然,如果你對JavaScript的Date類型不太了解,可以先去runoob.com上面了解下。
接著說回來,Time.getFormatTime()方法就是自定義指令v-time所需要的,參數(shù)為毫秒級時間戳,返回已經(jīng)整理好的時間格式的字符串。
最后,來看我們?nèi)绾斡肰ue自定義一個指令v-time:
Vue.directive('time',{ bind:function(el, binding){ el.innerHTML = Time.getFormatTime(binding.value); el.__timeout__ = setInterval(function(){ el.innerHTML = Time.getFormatTime(binding.value); }, 60000) }, unbind:function(el){ clearInterval(el.__timeout__); delete el.__timeout__; } })
在bind鉤子里,將指令v-time表達(dá)式的值binding.value作為參數(shù)傳入Time.getFormatTime()方法中得到格式化時間,在通過el.innerHTML寫入指令所在元素。定時器el.__timeout__每分鐘觸發(fā)一次,更新時間,并且在unbind鉤子里清除掉。
你可能會問,這個binding.value是什么?
當(dāng)然,你可以通過console.log(binding)方法在控制臺打印一下,就一目了然了。
在這里,我先補(bǔ)充下,自定義指令的選項是由幾個鉤子函數(shù)組成的,有bind、insert、update、componentUpdated、unbind。而其中的bind和unbind只調(diào)用一次。每個鉤子函數(shù)都有幾個參數(shù)可用,比如我們上面用到的el和binding。
el指令所綁定的元素可以用來直接操作DOM。而binding是一個對象,包含很多屬性,如上圖所示:
總結(jié)
在編寫自定義指令時,給DOM綁定一次性事件等初始動作,建議在bind鉤子內(nèi)完成,同時要在unbind內(nèi)解除相關(guān)綁定。
以上所述是小編給大家介紹的使用Vue開發(fā)一個實時性時間轉(zhuǎn)換功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
網(wǎng)站標(biāo)題:使用Vue開發(fā)一個實時性時間轉(zhuǎn)換指令
URL鏈接:http://aaarwkj.com/article36/jeiisg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁設(shè)計公司、移動網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、用戶體驗、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)