【Vue——自定义指令】Vue3的日期时间格式化

日期时间格式化

demo目录

在这里插入图片描述

具体实现

使用插件

dayjs
npm install dayjs -d

//formate-time.js
import dayjs from 'dayjs'
export default function(app){
    let formatString = 'YYYY-MM-DD HH:mm:ss'
    app.directive('format-time',{
        created(el,bindings) {
            if(bindings.value){
                formatString = bindings.value
            }
        },
        mounted(el) {
            const textContent = el.textContent
            let timeStamp = parseInt(textContent)
            if(textContent.length===10){
                timeStamp = timeStamp * 1000
            }
            el.textContent = dayjs(timeStamp).format(formatString)
        },  
    })
}
//index.js
// eslint-disable-next-line no-unused-vars
import resgisterFomatTime from './formate-time';

export default function registerDirectives(app){
    resgisterFomatTime(app)
}
//main.js
import { createApp } from 'vue'
import App from './App.vue'
import registerDirectives from './directives'
// 修改后
const app = createApp(App);
registerDirectives(app)
app.mount('#app')
// 修改前
// createApp(App).mount('#app')
//App.vue
<template>
  <h2 v-format-time="'YYYY/MM/DD'">{{timeStamp}}</h2>
  <!-- <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld msg="Welcome to Your Vue.js App"/> -->
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    // eslint-disable-next-line vue/no-unused-components
    HelloWorld
  },
  setup() {
    const timeStamp = 1667809876417
    return {
      timeStamp
    }
  }
}
</script>

实现效果

在这里插入图片描述

小问题

如果在同一vue文件中,多次使用的自定义指令,并且给formatString赋值,那么同一文件中,其他使用的地方也会套用格式。

解决呢
//formate-time.js
import dayjs from 'dayjs'
export default function(app){
    //let formatString = 'YYYY-MM-DD HH:mm:ss'换位置
    app.directive('format-time',{
        created(el,bindings) {
        //修改后
        	bindings.formatString = 'YYYY-MM-DD HH:mm:ss'
            if(bindings.value){
                formatString = bindings.value
            }
        },
        mounted(el) {
            const textContent = el.textContent
            let timeStamp = parseInt(textContent)
            if(textContent.length===10){
                timeStamp = timeStamp * 1000
            }
            el.textContent = dayjs(timeStamp).format(bindings.formatString)
            //这里就可以在bindings中拿到formatString
        },  
    })
}

指令生命周期

  • created :在绑定元素的attribute(属性)或事件监听器被应用之前调用
  • beforeMount:当指令第一次绑定到元素并且挂载父组件之前调用
  • mounted:在绑定元素的父组件被挂载后调用
  • beforeUpdate:在更新包含组件的VNode之前调用
  • updated:在包含组件的VNoe及其子组件的VNode更新后调用
  • beforeUnmount:在卸载绑定元素的父组件之前调用
  • unmouted:当指令与元素解除绑定且父组件已卸载时,只调用一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值