- npm install vue-event-calendar --save
入口 Main.js
- import 'vue-event-calendar/dist/style.css' //1.1.10之后的版本,css被放在了单独的文件中,方便替换
- import vueEventCalendar from 'vue-event-calendar'
- Vue.use(vueEventCalendar, {locale: 'en'}) //可以设置语言,支持中文和英文
Vue.use(vueEventCalendar, {
locale: 'zh', //可以设置语言,支持中文和英文 'zh' , 'en' , 'es', 'pt-br', 'ja', 'ko', 'fr', 'it', 'ru', 'de', 'vi'
//color: 'black', //Set main color
//className: 'Custom className for current clicked date', // (default: 'selected-day')
//weekStartOn: '0' // Can be: 1, 2, 3, 4, 5, 6, 0 (default: 0)
})
用法示例
- <template>
- <vue-event-calendar :events="demoEvents" @month-changed="handleMonthChanged" @day-changed="handleDayChanged"></vue-event-calendar>
- </template>
- <script>
- export default {
- data() {
- return {
- demoEvents: [{
- date: '2016/12/15',
- title: 'eat',
- desc: 'longlonglong description'
- }, {
- date: '2016/11/12',
- title: 'this is a title'
- }]
- }
- },
- methods: {
- handleMonthChanged(data) {
- console.log('month-changed', data)
- },
- handleDayChanged(data) {
- console.log('date-changed', data)
- },
- }
- }
- </script>
这里的日历没有样式,作一下简单样式:
- <style>
- .__vev_calendar-wrapper .cal-wrapper .cal-header .title {
- font-size: 16px;
- }
- .__vev_calendar-wrapper .cal-wrapper .cal-header {
- padding-bottom: 0;
- }
- .__vev_calendar-wrapper .cal-wrapper .cal-body .weeks {
- font-size: 16px;
- font-weight: bold;
- }
- .__vev_calendar-wrapper .cal-wrapper .cal-body .dates .item .date-num {
- font-size: 14px;
- }
- .day {
- color: brown;
- }
- </style>
如果点击后想要将点击的日期高亮显示:
- handleDayChanged(data) {
- // 选择日期
- let date = data.date;
- this.demoEvents = [{
- date:date,
- title:""
- }];
- console.log(this.demoEvents)
- },
自定义事件模版(可以允许你展示更多信息)
vue-event-calendar允许自定义事件模版,但是这个功能需要Vue 2.1.0版本以上才可以使用。原因是我试用了2.1.0以上才有的新功能作用域插槽(Scoped Slots)。
- <template>
- <vue-event-calendar :events="demoEvents">
- <template scope="props">
- <div v-for="(event, index) in props.showEvents" class="event-item">
- <!-- 这里拿到的是传入的单个event所有数据 -->
- {{event}}
- </div>
- </template>
- </vue-event-calendar>
- </template>
- <script>
- export default {
- data () {
- return {
- demoEvents: [{
- date: '2016/12/15',
- title: 'eat',
- desc: 'longlonglong description'
- },{
- date: '2016/11/12',
- title: 'this is a title'
- }]
- }
- }
- }
- </script>
组件事件
可以监听的事件有两个,选择了哪天和当月是哪月,当发生改变时,会触发监听函数。函数中的回调参数为改变后的日期。
- <template>
- <vue-event-calendar
- :events="demoEvents"
- @day-changed="handleDayChanged"
- @month-changed="handleMonthChanged">
- </vue-event-calendar>
- </template>
Options
- // 当 Vue.use时, 可以设置的参数
- {
- locale: 'en',
- color: 'black', //Set main color
- className: 'Custom className for current clicked date', // (default: 'selected-day')
- weekStartOn: 'week Start on which day' // Can be: 1, 2, 3, 4, 5, 6, 0 (default: 0)
- }
API
- // 下个月
- this.$EventCalendar.nextMonth()
- // 上个月
- this.$EventCalendar.preMonth()
- //到指定日期
- this.$EventCalendar.toDate('2016/11/12')
js获取本周、本月、本季、本年的第一天:http://www.yoyo88.cn/note/frontend/194.html
js转换Date日期格式 / 时间转换:http://www.yoyo88.cn/note/frontend/195.html
github demo:https://github.com/GeoffZhu/vue-event-calendar/tree/master/demo
使用自定义指令绑定用户点击日期 :
- <template>
- <vue-event-calendar v-clickCalendar></vue-event-calendar>
- </template>
- <script>
- export default {
- directives: {
- // 自定义事件
- clickCalendar:{
- // 点击日历
- bind: function (el, binding, vnode) {
- let currentObj = el; //当前元素
- // console.log(currentObj);
- currentObj.addEventListener('click', function(e) {
- let childObj = e.target;
- console.log(childObj);
- })
- }
- },
- },
- }
- </script>
这里的6,是表示当前选中的样式,在这个插件中并没有监听事件,利用vue的自定义指定加一个:
如果点击日历,给当前点击的元素加一个active的样式,并且写入一个is-Choose的div,因为原本的里面有一个is-Event的色块,所以不能直接给类名,还得再添加一个色块,色块样式:
- /* 捕捉用户点击添加样式 */
- .publishMy .__vev_calendar-wrapper .cal-body .dates .item.active .is-Choose {
- content: "";
- width: 36px;
- height: 36px;
- position: absolute;
- left: 50%;
- top: 50%;
- z-index: 1px;
- margin-left: -18px;
- margin-top: -19px;
- border: 1px solid #f4cf29;
- border-radius: 0.083rem;
- }
- .publishMy .event.active .is-Choose{
- border-color:#8c7301 !important;
- z-index: 999;
- }
在添加点击事件之前,先将所有的active类名清除,再清除is-Choose这个div
- directives: {
- // 自定义指令
- clickCalendar: {
- // 点击日历
- bind: function(el, binding, vnode) {
- let currentObj = el; //当前元素
- // console.log(currentObj);
- currentObj.addEventListener("click", function(e) {
- let cls = "active";
- var foreachObj = currentObj.firstChild.lastChild.lastChild; //需要foreach的对象
- // 遍历子节点
- var childs = foreachObj.childNodes;
- for (var i = childs.length - 1; i >= 0; i--) {
- // 如果子节点有active这个类名
- if (
- childs[i].className.match(
- new RegExp("(\\s|^)" + cls + "(\\s|$)")
- )
- ) {
- // 先删除类名
- var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
- childs[i].className = childs[i].className.replace(
- reg,
- " "
- );
- // 再删除最后一个子节点isChoose:
- childs[i].removeChild(childs[i].lastChild);
- }
- }
- let childObj = e.target.parentNode;
- childObj.className += " " + cls;
- var newNode = document.createElement("div");
- newNode.className = "is-Choose";
- childObj.appendChild(newNode);
- });
- }
- }
- },
第二款,支持农历显示:
github:https://github.com/jinzhe/vue-calendar
demo:https://jinzhe.github.io/vue-calendar/