Vue自定义指令--实时时间转换指令

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="Vue.2.6.10.js"></script>
</head>
<body>
    <!-- 一般在服务端的存储时间格式是unix时间戳,如1483200000,本实例来实现这样一个自定义指令v-time,将表达式传入的时间戳转换为相对时间 -->
    <div id="app1">
        <div v-time="timeNow"></div>
        <div v-time="timeBefore"></div>
        <input type="text" :value="test" @input="changeTest">
        <p v-time="test"></p>
        <p>{{ test }}</p>
    </div>
</body>
<script>
    //为了使判断逻辑更简单,统一使用时间戳进行大小判断,声明一个对象Time,将它们都封装在里面
    var Time  = {
        //获取当前时间戳
        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();
        },
        //获取今年一月一日0点0分0秒的时间戳
        getYearUnix:function(){
            var date = new Date();
            date.setMonth(0);
            date.setDate(0);
            date.setHours(0);
            date.setMinutes(0);
            date.setSeconds(0);
            date.setMilliseconds(0);
            return date.getTime()
        },
        //获取标准的年月日
        getLastDate:function(time){
            var date = new Date(time);//传入的是unix时间戳
            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;
        },
        //格式化时间
        getFormatTime:function(timestamp){
            var now = this.getUnix();//调用这个对象的2这个方法
            var today = this.getTodayUnix();//今天0点时间戳
            var year = this.getYearUnix();
            var timer = (now - timestamp) / 1000;//转换为秒级时间戳
            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/60) + '小时前'
            }else if(timer/86400 <= 31){
                tip = Math.ceil(timer/86400) + '天前'
            }else{
                tip=this.getLastDate(timestamp)
            };

            return tip;
        }
    };
    Vue.directive('time',{
        bind:function(el,binding){
            console.log(el,binding);
            el.innerHTML = Time.getFormatTime(binding.value);
            el._timeout_ = setInterval(function(){
                el.innerHTML = Time.getFormatTime(binding.value);
            },60000)// 每分钟触发一次
        },
        update:function(el,binding){
            el.innerHTML = Time.getFormatTime(binding.value);
        },
        unbind:function(el){
            clearInterval(el._timeout_);
            delete el._timeout_;
        }
    })
    // console.log(new Date(1488930695721));
    var app1 = new Vue({
        el:"#app1",
        data:{
            timeNow:(new Date()).getTime(),
            timeBefore:1488930695721,//为了便于示范这里是一个写死的时间,且这个时间戳是毫秒级的
            //如果服务器返回的是秒级,需要乘以1000
            test:1488930695721
        },
        methods: {
            changeTest:function(e){
                this.test = e.target.value;
            }
        },
        watch: {
            test:function(){
                console.log(arguments);
            }
        },
    });
</script>
</html>

框起来的部分是被我魔改了一下,为了实现一个输入时间戳执行时间转换的小测试~

posted @ 2019-06-15 10:26  林不渡  阅读(1115)  评论(0编辑  收藏  举报