Full calendar base on Vue2 and dayjs. Support month and week view. Custom date item style with scopeSlots.
// npm
npm install vue2-event-calendar --save
// yarn
yarn add vue2-event-calendar// import component
import 'vue2-event-calendar/dist/vue2-event-calendar.css'
import Calendar from 'vue2-event-calendar'
Vue.component('Calendar', Calendar)Or import as a component
import 'vue2-event-calendar/dist/vue2-event-calendar.css'
import { Calendar } from 'vue2-event-calendar'
// ...
export default {
components: { Calendar }
}<!-- template -->
<Calendar startDate="2018-03-07" :dateData="data">
<div slot="header-left">
<Button>month</Button>
<Button>week</Button>
</div>
<div
:class="['calendar-item', { 'is-otherMonth': !isCurMonth }]"
slot-scope="item"
>
<div
:class="['calendar-item-date']">
{{item.date.date}}
</div>
<div class="calendar-item-name">{{item.data.title}}</div>
</div>
</Calendar>Get full control use body slot. Data structure is a matrix and the size is 6*7.
<Calendar startDate="2018-03-07" :dateData="data">
<div slot="header-left">
<Button>month</Button>
<Button>week</Button>
</div>
<template v-slot:body="{ data }">
<transition name="fade">
<div class="calendar-body-grid" :key="indentifier">
<div v-for="(row, index) in data"
:key="index"
class="calendar-body-row">
<div v-for="col in row"
:key="col.date.date"
:class="['calendar-item', { 'is-otherMonth': !col.isCurMonth }]">
<div
:class="['calendar-item-date']">
{{col.date.date}}
</div>
<div class="calendar-item-name">{{col.data.title}}</div>
</div>
</div>
</div>
</transition>
</template>
</Calendar><!-- template -->
<Calendar
startDate="2018-03-07"
:renderHeader="renderHeader"
:dateData="data">
<!-- content -->
</Calendar>export default {
// ...
methods: {
renderHeader({ prev, next, selectedDate }) {
const h = this.$createElement
const prevButton = h('div', {
on: {
click: prev
}
}, ['prev'])
const nextButton = h('div', {
on: {
click: next
}
}, ['next'])
return h('div', [prevButton, selectedDate, nextButton])
}
}
}| parameter | description | type | default | acceptable value |
|---|---|---|---|---|
| startDate | calendar start date | String, timestamp, Date | new Date() | |
| dateData | calendar data, item object must have date params to match date(params key can use matchKey to modify) |
Object, Array | ||
| matchKey | if dateData is Array, specify which key of dateData object as calendar date match key | String | date | |
| locale | set weekdays locale text, custom this text use weekDateShort props. If want to use custom local, use weekLocaleData customize you locale |
String | en | zh-cn, en |
| weekLocaleData | set body weekdays text, begin with sunday, if set this props, locale will be not work | array | ||
| firstDay | start day of the week, 0 to 6, 0 as Sunday | Number | 0 | 0 - 6 |
| mode | component view mode | String | month | month, week |
| prefixCls | component style namespace | String | vue-calendar | |
| renderHeader | redner function for header | Function({ prev, next, selectedDate }) |
| parameter | description | params |
|---|---|---|
| onMonthChange | trigger when calendar date change | (date) parameter has two key startDay and endDay of selected month |
| onPrev | trigger after clicking the prev button | same as onMonthChange param |
| onNext | trigger after clicking the next button | same as onMonthChange param |
| name | description | params |
|---|---|---|
| changeDate | set calendar display month | (date) accept String or Date Object |
| name | description |
|---|---|
| header-left | header left panel |
| header-right | header right panel |
| name | description |
|---|---|
| default | custom content for date item, the scope param is { isPrevMonth, isPrevLastDay, isNextMonth, isNextFirstDay, isToday, isCurMonth, data, date }, { data } is an Array, include all matching date data |
| body | return all date item in scope param, data structure is a 6*7 matrix, and the date item is same as default scope slot |