はじめに
こんにちは。エンジニアの仕事をしている、たかふみです。
javascriptの日付処理ライブラリである、Day.js
をVue3で使用する方法についてまとめたいと思います。
Day.jsの導入経緯
JavaScriptは日付処理がややこしい。
Javascriptは、日付処理がややこしいです。年月日の表示を以下のように、わざわざオブジェクト指向チックに扱わなければいけません。
const now = new Date() const year = now.getFullYear() const month = now.getMonth() + 1 const day = now.getDate() console.log(`${year}年${month}月${day}日`) // 2021年9月29日 と出力
PHPだったら、日付表示は以下のように簡単に表示できるのにね。
<?php echo date("Y年m月d日") ;
JavaScriptで簡単に日付処理を扱えるライブラリないのか探すことにしました。
momentは既に死んでいる
Javascriptの日付処理ライブラリで人気のものはmoment.js
だと思います。
githubでスターが4万件もついている人気のライブラリです。
しかし、moment.js
の公式を見ると、メンテナンスモードのレガシープロジェクトであり、もう機能の追加などはしないようです。
フロントエンド界隈の進化は早いので、もう開発しないのであれば、moment.js
の使用はためらいます。
Day.js、君に決めた
moment.js
の代替ライブラリは何がいいのでしょうか?
候補として、Luxon
,Day.js
,date-fns
,js-joda
が挙げられていますが、私はDay.js
を採用することにしました。
理由としては、日付フォーマットの仕方がPHPに似ており、シンプルに使えそうだからです。
PHPerでフロントエンドも開発する方に、Day.js
は向いてるかもしれません。
また、他の日付ライブラリと比較して軽量ライブラリであるというのも非常に強みです。
Vue.js(Vue3)でのDay.js使用方法
Day.jsのインストール
npmでのインストール方法です
npm install dayjs --save
Day.jsをvue.jsへ読ませる方法(inject/provide使用)
vue.jsをマウントする処理にて、以下のようにprovide
へ設定してあげると、便利に使えます。
app.config.globalProperties
へ渡して使う方法もあるのですが、それはdayjs
の呼び出し方が少し手間になるので、provide/inject
で考えたほうがベターだと思います。
main.js
import {createApp} from 'vue' import App from './App.vue' // dayjsのインポート import dayjs from 'dayjs' // ロケールのインポート import 'dayjs/locale/ja' // ロケール設定 dayjs.locale('ja') const app = createApp({ components: { App }, }) // dayjsをprovideに設定する app.provide('dayjs', dayjs) app.mount('#app')
App.vue
<script setup> import {inject} from 'vue' // injectからdayjsを呼び出す const dayjs = inject('dayjs') console.log(dayjs().format('YYYY年M月DD日')) </script> <template> 今日は{{dayjs().format('YYYY年M月DD日')}}です。 </template>
Day.jsをvue.jsへ読ませる方法(globalProperties使用)
なお、globalProperties
に設定した場合は以下のようになります。
VueのインスタンスのglobalProperties
にdayjs
を設定します。
ただし、globalPropertiesに定義する場合、コンポーネントのscript内部では、getCurrentInstance
からdayjsを呼び出して使用しないといけません。少し面倒ですね。
しかし一方で、メリットも存在し、コンポーネントでdayjs
の関数を定義しなくてもtemplate側でdayjs
が使用できるメリットも存在します。
結局は、inject/provide方式のほうがシンプルで良い気がします。
main.js
import {createApp} from 'vue' import App from './App.vue' // dayjsのインポート import dayjs from 'dayjs' // ロケールのインポート import 'dayjs/locale/ja' // ロケール設定 dayjs.locale('ja') const app = createApp({ components: { App }, }) // dayjsをglobalPropertiesに設定する app.config.globalProperties.dayjs = dayjs app.mount('#app')
App.vue
<script setup> import {getCurrentInstance} from 'vue' const app = getCurrentInstance() // dayjsをglobalPropertiesから取得 const dayjs = app.appContext.config.globalProperties.dayjs console.log(dayjs().format('YYYY年M月DD日')) </script> <template> <!--この関数は、script側で定義しなくても動作します--> 今日は{{dayjs().format('YYYY年M月DD日')}}です。 </template>
Day.jsプラグインの読ませ方
day.js
にはプラグインが存在します。
日付が特定日より前かどうかなど、便利関数がプラグインとして定義されています。
それらプラグインの読み込ませ方は、以下のように、dayjsをインポートした後、extends
して設定します。
main.js
import {createApp} from 'vue' import App from './App.vue' // dayjsのインポート import dayjs from 'dayjs' // ロケールのインポート import 'dayjs/locale/ja' // ロケール設定 dayjs.locale('ja') // ↓使用するプラグインを追加 dayjs.extend(require('dayjs/plugin/isBetween')) dayjs.extend(require('dayjs/plugin/isSameOrAfter')) dayjs.extend(require('dayjs/plugin/isSameOrBefore')) const app = createApp({ components: { App }, }) // dayjsをprovideに設定する app.provide('dayjs', dayjs) app.mount('#app')
以下のように、プラグインを使用することができます
import {inject} from 'vue' const dayjs = inject('dayjs') // 2021年10月1日は、2021年9月15日と2021年11月1日の間にあるかどうかtrue/falseで返却される console.log(dayjs('2021-10-01').isBetween('2021-09-15', '2021-11-01')) // true // 2021年10月1日は、2021年10月11日より後なのかtrue/falseで返却される console.log(dayjs('2021-10-01').isSameOrAfter('2021-10-11')) // false // 2021年10月1日は、2021年10月11日より前なのかtrue/falseで返却される console.log(dayjs('2021-10-01').isSameOrBefore('2021-10-13')) // true
まとめ
いかがでしたでしょうか。JavaScriptの日付操作ライブラリである、Day.js
をVue.jsで使用する方法についてまとめました。
皆様の開発のお役に立てたら光栄です。ありがとうございました。