#はじめに
npmjs.comではVue.jsのdatepicker関連で最もダウンロードされたプラグインはvuejs-datepicker
のようです。
ダウンロードが多いのはあ間違いなくvuejs-datepicker
には、datepickerに必要な機能がすべて備わっているのではないかと思います。
Nuxt.jsでvuejs-datePickerを使用する時使い方や利用する方法を個人的にまとめてみました。
##インストール
% npm install vuejs-datepicker
% npm i -D vuejs-datepicker
どちらでも良いと思います。
##プラグインに登録
nuxtではvuejs用のプラグインを使用するためにはプラグインの登録が必要でplugins
の直下にjsファイルを作成する作業が必要となります。
import Vue from 'vue'
import DatePicker from 'vuejs-datepicker'
Vue.component('DatePicker', DatePicker)
##config.jsに登録
プラグインに登録したファイルをnuxt.config.js
に呼び出しをしたらいよいよvuejs-datepicker
が使えるようになります。
plugins: [
{ src: '~/plugins/vuejs-datepicker.js', mode: 'client', ssr: false },
]
##使い方
実際使うcomponent内にDatepicker
を直接importをします。
import DatePicker from 'vuejs-datepicker/src/components/Datepicker.vue'
これでDatePicker
でvuejs-datepicker
を使うことができます!
使い方は import
した変数名を書くだけでカレンダが使えます。
<template lang="pug">
div
DatePicker
</template>
カレンダーが英語になっているので日本語かにするためにはscript
タグないに下記のコードを追加する必要があります。
import { ja } from 'vuejs-datepicker/dist/locale'
componentにlanguageをバインドをしたら英語→日本語になります。
data(){
return{
ja:ja, //data登録
calendarDate: ''
}
}
<template lang="pug">
div
DatePicker(
:v-model='calendarDate',
:language='ja', //日本語化バインド
)
</templet>
日本語化にできたと思ったらformatが少し分かりづらいのでmoment.js
をインストールしてformat
をYYYY-MM-DD
に変更したい思います。
% npm i -D moment
momentインストールしてから
import moment from 'moment'
componentのscript
タグの中にmomentをimportをします。
methods: {
//format custom function
customFormatter(date) {
return moment(date).format('YYYY-MM-DD')
}
}
formatを変えるためにはmethods
を作成しバインド。
<template lang="pug">
div
DatePicker(
:v-model='calendarDate',
:language='ja', //日本語化バインド
:format='customFormatter',//formatバインド
)
</templet>
formatの変更してきたらまた新たな問題がv-modelの値が英語のままになっていて時間?よく分からない表記 Sat Aug 01 2020 09:00:00 GMT+0900 (日本標準時)
になっていて画面に表示されているformatは表示形式を設定する為の属性らしくv-modelは単に日付オブジェクト型の仕様ようです。
解決方法としては変更されたformatをdatePickerが閉じた際v-model
の値をYYYY-MM-DD
に変更する流れです。
methods: {
pickerClosedChange() {
if (this.calendarDate) {
this.calendarDate = moment(this.calendarDate).format('YYYY-MM-DD')
}
},
}
<template lang="pug">
div
DatePicker(
:v-model='calendarDate',
:language='ja', //日本語化バインド
:format='customFormatter',//formatバインド
@closed='pickerClosedChange' //pickerを閉じた時v-modelのformatを変更
)
</template>
format
とv-model
のSat Aug 01 2020 09:00:00 GMT+0900 (日本標準時)
から値が同じくYYYY-MM-DD
になりました。
と思ったら...
知らないうちにマークアップエラーが.....
Nuxt.jsフレームワークと統合する場合、プラグインはSSR(Node JSによるサーバー側レンダリング)をサポートしてないので、ページ全体を壊します。実際ほとんどのdatepickerプラグインもSSRをサポートしてないようです。
SSRを対応しない場合はマークアップが正しくないエラーが下記みたいに出てしまうので
nuxt公式サイトによるとnuxtのバージョンがv2.9.0未満の場合、<client-only>
のかわりに <no-ssr>
を使用しを推奨するらしいです。
<template lang="pug">
div
client-only //<-追加
DatePicker(
:v-model='calendarDate',
:language='ja', //日本語化バインド
:format='customFormatter',//formatバインド
@closed='pickerClosedChange' //pickerを閉じた時v-modelのformatを変更
)
</template>
これでdatePicker
inputのコードが完成しました!
<template lang="pug">
div
client-only //<-追加
DatePicker(
:v-model='calendarDate',
:language='ja', //日本語化バインド
:format='customFormatter',//formatバインド
@closed='pickerClosedChange' //pickerを閉じた時v-modelのformatを変更
)
</template>
<script>
//moment import
import moment from 'moment'
//DatePicker import
import DatePicker from 'vuejs-datepicker/src/components/Datepicker.vue'
//言語をimport
import { ja } from 'vuejs-datepicker/dist/locale'
export default {
data(){
return{
ja:ja, //data登録
calendarDate: ''
}
},
methods: {
/*format custom function
* datePickerのformatをYYYY-MM-DDにする
*/
customFormatter(date) {
return moment(date).format('YYYY-MM-DD')
},
/*v-model vule custom function
* datePickerを閉じた時formatをYYYY-MM-DDにする
*/
pickerClosedChange() {
if (this.calendarDate) {
this.calendarDate = moment(this.calendarDate).format('YYYY-MM-DD')
}
},
}
}
</script>
最後にこのまま使ってしまうとIEで動かなくなったのでIE対応するためnuxt.config.js
を修正する必要があります。ちょこっと調べたらプラグインが「node_modulesでにあり、
ES6モジュールをエクスポートしている場合、それを transpileビルドオプションに追加する必要がある
」よく分からない要はライブラリ内のコンポーネントはコンパイルされなく、IE11に対応したコードが出力されないようです。
export default {
build: {
transpile: ['vuejs-datepicker'], //追加
},
};
以上です。!