欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Vue開發(fā)一個實時性時間轉(zhuǎn)換指令

 更新時間:2018年01月17日 10:17:37   作者:閏土大叔  
我們就來實現(xiàn)這樣一個Vue自定義指令v-time,將表達(dá)式傳入的時間戳實時轉(zhuǎn)換為相對時間。下面小編給大家?guī)砹耸褂肰ue開發(fā)一個實時性時間轉(zhuǎn)換指令,需要的朋友參考下吧

前言

最近有一個說法,如果你看見某個網(wǎng)站的某個功能,你就大概能猜出背后的業(yè)務(wù)邏輯是怎么樣的,以及你能動手開發(fā)一個一毛一樣的功能,那么你的前端技能算是進(jìn)階中高級水平了。比如咱們今天要聊的這個話題:如何用Vue開發(fā)一個實時性的時間轉(zhuǎn)換指令?

接下來正文從這開始~

 如上圖所示(我是截取的某技術(shù)社區(qū)首頁的部分頁面),大家看到用紅色邊框勾選中的時間文字了吧。很多網(wǎng)站發(fā)布動態(tài)的時候,都會有一個相對本機時間轉(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)換的邏輯:

  • 1分鐘以前,顯示“剛剛”。
  • 1分鐘~1小時之間,顯示“xx分鐘前”。
  • 1小時~1天之間,顯示“xx小時前”。
  • 1天~1個月(31天)之間,顯示“xx天前”。
  • 大于1個月,顯示“xx年xx月xx日”。

這樣羅列出來,邏輯就一目了然了。為了使判斷更簡單,我們這里統(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)方法在控制臺打印一下,就一目了然了。

在這里,我先補充下,自定義指令的選項是由幾個鉤子函數(shù)組成的,有bind、insert、update、componentUpdated、unbind。而其中的bind和unbind只調(diào)用一次。每個鉤子函數(shù)都有幾個參數(shù)可用,比如我們上面用到的el和binding。

el指令所綁定的元素可以用來直接操作DOM。而binding是一個對象,包含很多屬性,如上圖所示:

  • name:指令名
  • rawName:自定義指令
  • value:指令的綁定值
  • expression:綁定值的字符串形式
  • modifiers:一個包含修飾符的對象

總結(jié)

在編寫自定義指令時,給DOM綁定一次性事件等初始動作,建議在bind鉤子內(nèi)完成,同時要在unbind內(nèi)解除相關(guān)綁定。

以上所述是小編給大家介紹的使用Vue開發(fā)一個實時性時間轉(zhuǎn)換功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解決vue-cli單頁面手機應(yīng)用input點擊手機端虛擬鍵盤彈出蓋住input問題

    解決vue-cli單頁面手機應(yīng)用input點擊手機端虛擬鍵盤彈出蓋住input問題

    今天小編就為大家分享一篇解決vue-cli單頁面手機應(yīng)用input點擊手機端虛擬鍵盤彈出蓋住input問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • vue中el-tab如何點擊不同標(biāo)簽觸發(fā)不同函數(shù)的實現(xiàn)

    vue中el-tab如何點擊不同標(biāo)簽觸發(fā)不同函數(shù)的實現(xiàn)

    el-tab本身的功能是點擊之后切換不同頁,本文主要介紹了vue中el-tab如何點擊不同標(biāo)簽觸發(fā)不同函數(shù)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Element el-button 按鈕組件的使用詳解

    Element el-button 按鈕組件的使用詳解

    這篇文章主要介紹了Element el-button 按鈕組件的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue3中v-model的用法詳解

    vue3中v-model的用法詳解

    vue 提供了很多自定義指令,大大方便了我們的開發(fā),其中最常用的也就是 v-model,他可以在組件上使用以實現(xiàn)雙向綁定。它可以綁定多種數(shù)據(jù)結(jié)構(gòu), 今天總結(jié)一下用法
    2023-04-04
  • vue自定義loader將行內(nèi)樣式px轉(zhuǎn)rem適配

    vue自定義loader將行內(nèi)樣式px轉(zhuǎn)rem適配

    這篇文章主要為大家介紹了vue自定義loader將行內(nèi)樣式px轉(zhuǎn)rem適配示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Vue實現(xiàn)內(nèi)部組件輪播切換效果的示例代碼

    Vue實現(xiàn)內(nèi)部組件輪播切換效果的示例代碼

    這篇文章主要介紹了Vue實現(xiàn)內(nèi)部組件輪播切換效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • vue項目main.js配置及使用方法

    vue項目main.js配置及使用方法

    main.js是項目的入口文件,項目中所有的頁面都會加載main.js,本文主要介紹了vue項目main.js配置及使用方法,非常具有實用價值,需要的朋友可以參考下
    2023-05-05
  • vue輪播圖插件vue-awesome-swiper

    vue輪播圖插件vue-awesome-swiper

    這篇文章主要為大家詳細(xì)介紹了vue輪播圖插件vue-awesome-swiper,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Vue2.0 實現(xiàn)頁面緩存和不緩存的方式

    Vue2.0 實現(xiàn)頁面緩存和不緩存的方式

    今天小編就為大家分享一篇Vue2.0 實現(xiàn)頁面緩存和不緩存的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue項目中vue-echarts講解及常用圖表實現(xiàn)方案(推薦)

    vue項目中vue-echarts講解及常用圖表實現(xiàn)方案(推薦)

    這篇文章主要介紹了vue項目中vue-echarts講解及常用圖表方案實現(xiàn),主要針對代碼示例中的內(nèi)容進(jìn)行問題講解,詳細(xì)代碼在文章中給大家提到,需要的朋友可以參考下
    2022-09-09

最新評論