event-nameプロパティで期待通りの結果にならない理由
v-calendar
コンポーネントのevent-name
プロパティに指定するファンクションでイベント名にイベント時間が重複して表示される件ですが、この原因はVuetify.jsが2.2.xから2.3.xへバージョンアップした際にv-calendar
コンポーネントに変更が加えられたためです。
ソースコードにどのような変更が加えられたかご興味がある場合は、下記に当該ソースコードのリンクを提示しますのでご覧ください。
genEvent
関数周りがイベント名の表示に関する処理です。
eventスロットを使う方法
v-calendar
コンポーネントのevent
スロットで、イベント名の表示方法をカスタマイズできます。
たとえば、カレンダーに
開始時間 - 終了時間
イベント名
【それ以外の内容】
のようにイベントを表記したい場合
下記のようなスロットを記述することで対応できます。
event
スロットにどのようなプロパティが渡されるかはオフィシャルドキュメントのAPIに記載されています。
vue
1<v-calendar ...省略... >
2 <template v-slot:event="props">
3 <div class="pl-1">
4 {{ props.eventParsed.start.time }} - {{ props.eventParsed.end.time }}
5 <br />
6 {{ props.event.name }}
7 <br />
8 【{{ props.event.xxxxx }}】
9 </div>
10 </template>
11</v-calendar>
注意点
ただし、この方法には2つ注意点があります。
1つ目
1つ目は、イベントの表示領域(高さ)が、イベントの開始時間 - 終了時間に関係している点です。
図は日表示のときのカレンダーですが、左側の時間軸にあわせてイベントが表示されていることがわかるとおもいます。
図の4つのイベントはすべて2行表示するようにしていますが、1,2番目のイベントは1行しか表示されていません。(改行以降も出力されているが隠れて見えない)
3番目は2行表示されていますが仮に3行目があった場合、やはり隠れて見えなくなります。(テキストの量に応じて高さが変わらない)
4番目は複数行表示できる余裕がありますが、どれくらいのテキストが表示できるかは事前に計算しておく必要があります。
2つ目
2つ目は、このスロットがカレンダーの表示タイプに関係なく使用される点です。
カレンダーの表示タイプには月表示、週表示、4日表示、日表示、カテゴリー表示がありますが、選択した表示タイプによって、イベントの表示領域が広くなったり狭くなったりします。
なので表示タイプによって、どのような情報を出力するかコントロールする必要があります。
上記の図は日表示のときですが、これを4日表示、週表示にすると下図のように横幅が狭くなります。
月表示の場合は時間軸がないのでイベントは1行で表示されます。
図はオフィシャルドキュメントの実行例ですが、開始時間があれば開始時間 イベント名
、開始時間が無ければイベント名
のように表示されます。
対応方法
基本的に1イベント1行表示にして、v-calendar
コンポーネントではイベント詳細をポップアップで表示することができるので、それを試されてはどうでしょうか?
たとえばイベントをクリックするとv-menu
コンポーネントを使ったダイアログボックスを表示することができます。
サンプルコードはオフィシャルドキュメントのイベントに載っています。