经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
基于Vue2-Calendar改进的日历组件(含中文使用说明)
来源:cnblogs  作者:越笨越爱  时间:2019/4/3 17:28:53  对本文有异议

一,前言

我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅……

于是网上搜了好久找到了Vue2-Calendar,不用说,挺好用的,但是同时也发现这个组件有些问题,有些功能挺不符合我们的要求,于是着手改了一版

二,改进的功能

在Vue2-Calendar v2.2.4 版基础上作了优化。
  1. 改进原控件无法切换语言的BUG,支持 lang='zh-CN'和'en'。
  2. 日历面板增加一个位置选项,允许让面板右对齐,只需要position=right即可。
  3. 原 :on-day-click 事件只有在 hasInput=false 时才生效,现改为一直有效,这样当用户点击日历面板上的日期后就可以触发该事件。
  4. clear=false时文本框右侧会显示一个日历图标,高仿bootstrap的日历组件,但clear=true时不显示

效果图

 

 

三,使用示例

1.常规使用,单日历

HTML代码:

  1. 1 <calendar v-model="value" show-date-only :disabled-days-of-week="disabled" :format="format" :clear-button="clear" :placeholder="placeholder" :lang="lang" :position="position" :on-day-click="dayClick">
  2. 2 </calendar>
View Code

JS代码:

  1. 1 var app = new Vue({
  2. 2 el: "#app",
  3. 3 data: function() {
  4. 4 return {
  5. 5 disabled: [], //禁用的日期
  6. 6 value: new Date(), //
  7. 7 format: "yyyy-MM-dd", //文本框中显示的日期格式
  8. 8 clear: false, //是否在文本框右侧显示清除按钮(X)
  9. 9 placeholder: "日期", //水印
  10. 10 position: "left", //日期面板位置,默认null和left 居左,right则靠右
  11. 11 lang: "" //语言,默认中文,可选值:zh-CN、en
  12. 12 };
  13. 13 },
  14. 14 methods: {
  15. 15 //鼠标点击日历面板上的日期时的事件,
  16. 16 //传递的两个参数均是同一个值,只是类型不同,随便用哪个看个人需要
  17. 17 //date 是 Date 类型
  18. 18 //dateStr 是 String 类型
  19. 19 dayClick: function(date, dateStr) {
  20. 20 console.log(date);
  21. 21 console.log(dateStr);
  22. 22 console.log(this.value);
  23. 23 }
  24. 24 },
  25. 25 components: {
  26. 26 calendar: Calendar
  27. 27 }
  28. 28 });
View Code

 

2.常规使用,双月日历

HTML代码:

  1. 1 <calendar v-model="value" show-date-only :disabled-days-of-week="disabled" :format="format" :clear-button="clear" :placeholder="placeholder" :lang="lang" :position="position" :on-day-click="dayClick" :pane="2">
  2. 2 </calendar>
View Code

JS代码:

  1. 1 var app = new Vue({
  2. 2 el: "#app",
  3. 3 data: function() {
  4. 4 return {
  5. 5 disabled: [], //禁用的日期
  6. 6 value: new Date(), //
  7. 7 format: "yyyy-MM-dd", //文本框中显示的日期格式
  8. 8 clear: false, //是否在文本框右侧显示清除按钮(X)
  9. 9 placeholder: "日期", //水印
  10. 10 position: "left", //日期面板位置,默认null和left 居左,right则靠右
  11. 11 lang: "" //语言,默认中文,可选值:zh-CN、en
  12. 12 };
  13. 13 },
  14. 14 methods: {
  15. 15 //鼠标点击日历面板上的日期时的事件,
  16. 16 //传递的两个参数均是同一个值,只是类型不同,随便用哪个看个人需要
  17. 17 //date 是 Date 类型
  18. 18 //dateStr 是 String 类型
  19. 19 dayClick: function(date, dateStr) {
  20. 20 console.log(date);
  21. 21 console.log(dateStr);
  22. 22 console.log(this.value);
  23. 23 }
  24. 24 },
  25. 25 components: {
  26. 26 calendar: Calendar
  27. 27 }
  28. 28 });
View Code

3.双日历联动,通常用在开始和结束时间的选择上,结束时间不能早于开始时间

说明:当选择了开始时间后,结束时间选择时会显示哪些日期可选,并且显示已经选择的开始时间

HTML代码:

  1. 1 <calendar v-model="value" show-date-only :disabled-days-of-week="disabled" :format="format" :clear-button="clear" :placeholder="'起始时间'" :lang="lang" :position="position" :on-day-click="dayClick" :pane="1" :range-bus="getBus" :range-status="1"></calendar>
  2. 2 <calendar v-model="value2" show-date-only :disabled-days-of-week="disabled" :format="format" :clear-button="clear" :placeholder="'结束时间'" :lang="lang" :position="position" :on-day-click="dayClick" :pane="1" :range-bus="getBus" :range-status="2"></calendar>
View Code

JS代码:

  1. 1 var app2 = new Vue({
  2. 2 el: "#app2",
  3. 3 data: function() {
  4. 4 return {
  5. 5 disabled: [],
  6. 6 value: new Date(),
  7. 7 value2: new Date(),
  8. 8 format: "yyyy-MM-dd",
  9. 9 clear: false,
  10. 10 placeholder: "Start Date",
  11. 11 position: "left",
  12. 12 lang: "",
  13. 13 bus: new Vue()
  14. 14 };
  15. 15 },
  16. 16 methods: {
  17. 17 dayClick: function(date, dateStr) {
  18. 18 console.log('value=' + this.value);
  19. 19 console.log('value2=' + this.value2);
  20. 20 },
  21. 21 getBus: function() {
  22. 22 return this.bus;
  23. 23 }
  24. 24 },
  25. 25 components: {
  26. 26 calendar: Calendar
  27. 27 }
  28. 28 });
View Code

 四,参数说明(翻译的官方文档)

安装(需要node支持)

  1. $ npm install vue2-slot-calendar

导入模块

  1. // js file
  2. import 'vue2-slot-calendar/lib/calendar.min.css';
  3. import calendar from 'vue2-slot-calendar/lib/calendar';
  4.  
  5. // vue file
  6. // in ES6 modules
  7. import Calendar from 'vue2-slot-calendar';
  8.  
  9. // in CommonJS
  10. const Calendar = require('vue2-slot-calendar');
  11.  
  12. // in Global variable
  13. const VueCalendar = Calendar;

直接引用编译好的js文件(推荐)

  1. <link rel="stylesheet" href="/lib/calendar.min.css" >
  2. <script src="/lib/calendar.min.js"></script>

多语言支持

系统提供window.VueCalendarLang 勾子函数来让用户自定义语言,

  1. window.VueCalendarLang=function(lang){
  2. return {}; //对象必须是下面JSON格式
  3. };

上面勾子函数返回的必须是下面格式的JSON对象。

下面的脚本在 /src/lang/zh-CN.js 中有

  1. {
  2. daysOfWeek: ["日", "一", "二", "三", "四", "五", "六"],
  3. limit: "超过限制 (最多{{limit}}项)",
  4. loading: "加载中...",
  5. minLength: "最小长度",
  6. months: [
  7. "一月",
  8. "二月",
  9. "三月",
  10. "四月",
  11. "五月",
  12. "六月",
  13. "七月",
  14. "八月",
  15. "九月",
  16. "十月",
  17. "十一",
  18. "十二"
  19. ],
  20. notSelected: "未选择",
  21. required: "必填项",
  22. search: "查找"
  23. }

  

构建步骤

  1. # 安装依赖
  2. npm install
  3.  
  4. # 运行开发服务器 localhost:4000
  5. npm run dev
  6.  
  7. # 编译(压缩JS和CSS等)
  8. npm run build
  9.  
  10. # 单元测试
  11. npm run unit
  12.  
  13. # 运行所有测试
  14. npm test

参数和事件

 

NameTypeDefaultDescription
value String '' 组件输入输出的值,即 v-model 的值
width String '200px' input文本框的宽度
format String yyyy-MM-dd 日期格式,可用值: d, dd, M, MM, MMM, MMMM, yyyy.
disabled-days-of-week Array   每周有哪些天禁用,可用值0-6,多个值则用逗号隔开
clear-button Bollean false 是否显示清除按钮,显示清除按钮时右侧的日历图标不显示,不显示清除按钮时则显示日历图标
placeholder String   文本框中显示的水印
hasInput Boolean true 是否显示文本框
pane Number 1 日历面板数量,默认1,双月日历设为2即可,目前仅支持1和2
borderWidth Number 2 日历面板边框线宽度
onDayClick Function   点击日期时的事件,已改为不受hasInput值的限制,总是触发
specialDays Object   特殊日期
changePane Function   切换日历面板时的事件, 暂时还没研究这个,大多数情况下用不到,请参考  /src/modules/Docs.vue
rangeBus Function   暂时不明白啥意思,请总是返回一个 new Vue() 就对了
rangeStatus Number 0 日期范围状态,默认0表示不使用日期范围,1表示双日历联动的起始日期,2表示双日历联动的结束日期
onDrawDate Function   绘制日期时的事件,可以让用户自定义日历样式
showDateOnly Boolean false 是否只显示日历面板
transfer Boolean false 是否将日历面板添加到 document.body中
elementId String   日历ID
firstDayOfWeek Number 0 每周第1天,0表示星期天,1表示星期一,其它依次类推


组件的所有属性值

  1. props: {
  2. value: {
  3. type: [String, Date]
  4. },
  5. format: {
  6. default: 'yyyy-MM-dd'
  7. },
  8. firstDayOfWeek: {
  9. // sunday
  10. default: 0
  11. },
  12. disabledDaysOfWeek: {
  13. type: Array,
  14. default () {
  15. return []
  16. }
  17. },
  18. width: {
  19. type: String,
  20. default: '200px'
  21. },
  22. clearButton: {
  23. type: Boolean,
  24. default: false
  25. },
  26. inputClasses: {
  27. type: String,
  28. default: ''
  29. },
  30. lang: {
  31. type: String,
  32. default: navigator.language
  33. },
  34. placeholder: {
  35. type: String
  36. },
  37. hasInput: {
  38. type: Boolean,
  39. default: true
  40. },
  41. pane: {
  42. type: Number,
  43. default: 1
  44. },
  45. borderWidth: {
  46. type: Number,
  47. default: 2
  48. },
  49. onDayClick: {
  50. type: Function,
  51. default () {}
  52. },
  53. changePane: {
  54. type: Function,
  55. default () {}
  56. },
  57. specialDays: {
  58. type: Object,
  59. default () {
  60. return {}
  61. }
  62. },
  63. rangeBus: {
  64. type: Function,
  65. default () {
  66. // return new Vue()
  67. }
  68. },
  69. rangeStatus: {
  70. type: Number,
  71. default: 0
  72. },
  73. onDrawDate: {
  74. type: Function,
  75. default () {}
  76. },
  77. maxDate: {
  78. type: String
  79. },
  80. minDate: {
  81. type: String
  82. },
  83. showDateOnly: {
  84. type: Boolean,
  85. default: false
  86. },
  87. transfer: {
  88. type: Boolean,
  89. default: false
  90. },
  91. elementId: [String]
  92. }

五,源码

以下是我改过后的源码:

https://github.com/alaxgit/Vue2-Calendar

六,直接引用JS

如果你喜欢直接引用JS和CSS,不喜欢用webpack编译啥的,可以直接下载编译好的文件:

https://github.com/alaxgit/Vue2-Calendar/blob/master/lib/calendar.min.js

https://github.com/alaxgit/Vue2-Calendar/blob/master/lib/calendar.min.css

 

原文链接:http://www.cnblogs.com/alax/p/10649295.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号