vue calender日历插件
vue 2017-11-17 13:59:31

 

C/C++ Code复制内容到剪贴板
  1. npm install vue-event-calendar --save  

入口 Main.js

JavaScript Code复制内容到剪贴板
  1. import 'vue-event-calendar/dist/style.css' //1.1.10之后的版本,css被放在了单独的文件中,方便替换  
  2. import vueEventCalendar from 'vue-event-calendar'  
  3. 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)
})

用法示例

JavaScript Code复制内容到剪贴板
  1. <template>  
  2.     <vue-event-calendar :events="demoEvents" @month-changed="handleMonthChanged" @day-changed="handleDayChanged"></vue-event-calendar>  
  3. </template>  
  4.   
  5. <script>  
  6.     export default {  
  7.         data() {  
  8.             return {  
  9.                 demoEvents: [{  
  10.                     date: '2016/12/15',  
  11.                     title: 'eat',  
  12.                     desc: 'longlonglong description'  
  13.                 }, {  
  14.                     date: '2016/11/12',  
  15.                     title: 'this is a title'  
  16.                 }]  
  17.             }  
  18.         },  
  19.   
  20.         methods: {  
  21.             handleMonthChanged(data) {  
  22.                 console.log('month-changed', data)  
  23.             },  
  24.             handleDayChanged(data) {  
  25.                 console.log('date-changed', data)  
  26.             },  
  27.         }  
  28.     }  
  29. </script>  

这里的日历没有样式,作一下简单样式:

CSS Code复制内容到剪贴板
  1. <style>  
  2.     .__vev_calendar-wrapper .cal-wrapper .cal-header .title {  
  3.         font-size16px;  
  4.     }  
  5.       
  6.     .__vev_calendar-wrapper .cal-wrapper .cal-header {  
  7.         padding-bottom: 0;  
  8.     }  
  9.       
  10.     .__vev_calendar-wrapper .cal-wrapper .cal-body .weeks {  
  11.         font-size16px;  
  12.         font-weightbold;  
  13.     }  
  14.       
  15.     .__vev_calendar-wrapper .cal-wrapper .cal-body .dates .item .date-num {  
  16.         font-size14px;  
  17.     }  
  18.       
  19.     .day {  
  20.         color: brown;  
  21.     }  
  22. </style>  

 1.jpg

 

如果点击后想要将点击的日期高亮显示:

JavaScript Code复制内容到剪贴板
  1. handleDayChanged(data) {  
  2.     // 选择日期  
  3.     let date = data.date;  
  4.     this.demoEvents = [{  
  5.         date:date,  
  6.         title:""  
  7.     }];  
  8.     console.log(this.demoEvents)    
  9. },  

 

 

 

自定义事件模版(可以允许你展示更多信息)

 vue-event-calendar允许自定义事件模版,但是这个功能需要Vue 2.1.0版本以上才可以使用。原因是我试用了2.1.0以上才有的新功能作用域插槽(Scoped Slots)。

XML/HTML Code复制内容到剪贴板
  1. <template>  
  2.   <vue-event-calendar :events="demoEvents">  
  3.       <template scope="props">  
  4.         <div v-for="(event, index) in props.showEvents" class="event-item">  
  5.           <!-- 这里拿到的是传入的单个event所有数据 -->  
  6.           {{event}}  
  7.         </div>  
  8.       </template>  
  9.     </vue-event-calendar>  
  10. </template>  
  11.   
  12. <script>  
  13. export default {  
  14.   data () {  
  15.     return {  
  16.       demoEvents: [{  
  17.         date: '2016/12/15',  
  18.         title: 'eat',  
  19.         desc: 'longlonglong description'  
  20.       },{  
  21.         date: '2016/11/12',  
  22.         title: 'this is a title'  
  23.       }]  
  24.     }  
  25.   }  
  26. }  
  27. </script>  

 

组件事件

可以监听的事件有两个,选择了哪天和当月是哪月,当发生改变时,会触发监听函数。函数中的回调参数为改变后的日期。

XML/HTML Code复制内容到剪贴板
  1. <template>  
  2.   <vue-event-calendar  
  3.     :events="demoEvents"  
  4.     @day-changed="handleDayChanged"  
  5.     @month-changed="handleMonthChanged">  
  6.   </vue-event-calendar>  
  7. </template>  

 

Options

JavaScript Code复制内容到剪贴板
  1. // 当 Vue.use时, 可以设置的参数  
  2. {  
  3.   locale: 'en',  
  4.   color: 'black'//Set main color  
  5.   className: 'Custom className for current clicked date'// (default: 'selected-day')  
  6.   weekStartOn: 'week Start on which day'  // Can be: 1, 2, 3, 4, 5, 6, 0 (default: 0)  
  7. }  

 

API

JavaScript Code复制内容到剪贴板
  1. // 下个月  
  2. this.$EventCalendar.nextMonth()  
  3.   
  4. // 上个月  
  5. this.$EventCalendar.preMonth()  
  6.   
  7. //到指定日期  
  8. 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

 

使用自定义指令绑定用户点击日期 :

XML/HTML Code复制内容到剪贴板
  1. <template>  
  2.   
  3. <vue-event-calendar v-clickCalendar></vue-event-calendar>  
  4.   
  5. </template>  
  6.   
  7.   
  8. <script>  
  9. export default {  
  10.   
  11.     directives: {   
  12.         // 自定义事件  
  13.         clickCalendar:{  
  14.             // 点击日历  
  15.             bind: function (el, binding, vnode) {  
  16.                 let currentObj = el; //当前元素  
  17.                 // console.log(currentObj);  
  18.                 currentObj.addEventListener('click', function(e) {  
  19.                     let childObj = e.target;  
  20.                     console.log(childObj);  
  21.                 })  
  22.             }  
  23.         },  
  24.     },  
  25.   
  26. }  
  27. </script>  

 B33DC2FD-FE11-4B42-ACB3-F98492411627.png

这里的6,是表示当前选中的样式,在这个插件中并没有监听事件,利用vue的自定义指定加一个:

如果点击日历,给当前点击的元素加一个active的样式,并且写入一个is-Choose的div,因为原本的里面有一个is-Event的色块,所以不能直接给类名,还得再添加一个色块,色块样式:

CSS Code复制内容到剪贴板
  1. /* 捕捉用户点击添加样式 */  
  2. .publishMy .__vev_calendar-wrapper .cal-body .dates .item.active .is-Choose {  
  3.     content"";  
  4.     width36px;  
  5.     height36px;  
  6.     positionabsolute;  
  7.     left: 50%;  
  8.     top: 50%;  
  9.     z-index1px;  
  10.     margin-left: -18px;  
  11.     margin-top: -19px;  
  12.     border1px solid #f4cf29;  
  13.     border-radius: 0.083rem;  
  14. }  
  15. .publishMy .event.active .is-Choose{  
  16.     border-color:#8c7301 !important;  
  17.     z-index: 999;  
  18. }  

 

 

在添加点击事件之前,先将所有的active类名清除,再清除is-Choose这个div

JavaScript Code复制内容到剪贴板
  1. directives: {  
  2.     // 自定义指令  
  3.     clickCalendar: {  
  4.         // 点击日历  
  5.         bind: function(el, binding, vnode) {  
  6.             let currentObj = el; //当前元素  
  7.             // console.log(currentObj);  
  8.             currentObj.addEventListener("click"function(e) {  
  9.                 let cls = "active";  
  10.   
  11.                 var foreachObj = currentObj.firstChild.lastChild.lastChild; //需要foreach的对象  
  12.                 // 遍历子节点  
  13.                 var childs = foreachObj.childNodes;  
  14.                 for (var i = childs.length - 1; i >= 0; i--) {  
  15.                     // 如果子节点有active这个类名  
  16.                     if (  
  17.                         childs[i].className.match(  
  18.                             new RegExp("(\\s|^)" + cls + "(\\s|$)")  
  19.                         )  
  20.                     ) {  
  21.                         // 先删除类名  
  22.                         var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");  
  23.                         childs[i].className = childs[i].className.replace(  
  24.                             reg,  
  25.                             " "  
  26.                         );  
  27.   
  28.                         // 再删除最后一个子节点isChoose:  
  29.                         childs[i].removeChild(childs[i].lastChild);  
  30.                     }  
  31.                 }  
  32.   
  33.                 let childObj = e.target.parentNode;  
  34.                 childObj.className += " " + cls;  
  35.                 var newNode = document.createElement("div");  
  36.                 newNode.className = "is-Choose";  
  37.                 childObj.appendChild(newNode);  
  38.             });  
  39.         }  
  40.     }  
  41. },  

 

 

 

 

 

 


 

第二款,支持农历显示:

github:https://github.com/jinzhe/vue-calendar

demo:https://jinzhe.github.io/vue-calendar/

 

 

 

 

本文来自于:http://www.yoyo88.cn/study/vue/214.html

上一篇 vue v-if
Powered by yoyo苏ICP备15045725号