基于Vue2-Calendar改进的日历组件(含中文使用说明)


Posted in Javascript onApril 14, 2019

一,前言

我是刚学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时不显示

效果图

基于Vue2-Calendar改进的日历组件(含中文使用说明)基于Vue2-Calendar改进的日历组件(含中文使用说明)基于Vue2-Calendar改进的日历组件(含中文使用说明)

三,使用示例

1.常规使用,单日历

基于Vue2-Calendar改进的日历组件(含中文使用说明)

HTML代码:

<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       </calendar>

JS代码:

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

 2.常规使用,双月日历

基于Vue2-Calendar改进的日历组件(含中文使用说明)

HTML代码:

<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       </calendar>

JS代码:

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

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

基于Vue2-Calendar改进的日历组件(含中文使用说明)

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

HTML代码:

<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    <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>

JS代码: 

var app2 = new Vue({
   el: "#app2",
   data: function() {
    return {
     disabled: [],
     value: new Date(),
     value2: new Date(),
     format: "yyyy-MM-dd",
     clear: false,
     placeholder: "Start Date",
     position: "left",
     lang: "",
     bus: new Vue()
    };
   },
   methods: {
    dayClick: function(date, dateStr) {
     console.log('value=' + this.value);
     console.log('value2=' + this.value2);
    },
    getBus: function() {
     return this.bus;
    }
   },
   components: {
    calendar: Calendar
   }
  });

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

安装(需要node支持)

$ npm install vue2-slot-calendar

导入模块

// js file
import 'vue2-slot-calendar/lib/calendar.min.css';
import calendar from 'vue2-slot-calendar/lib/calendar';
// vue file
// in ES6 modules
import Calendar from 'vue2-slot-calendar';
// in CommonJS
const Calendar = require('vue2-slot-calendar');
// in Global variable
const VueCalendar = Calendar;

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

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

多语言支持

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

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

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

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

{
 daysOfWeek: ["日", "一", "二", "三", "四", "五", "六"],
 limit: "超过限制 (最多{{limit}}项)",
 loading: "加载中...",
 minLength: "最小长度",
 months: [
  "一月",
  "二月",
  "三月",
  "四月",
  "五月",
  "六月",
  "七月",
  "八月",
  "九月",
  "十月",
  "十一",
  "十二"
 ],
 notSelected: "未选择",
 required: "必填项",
 search: "查找"
}

构建步骤

# 安装依赖
npm install
# 运行开发服务器 localhost:4000
npm run dev
# 编译(压缩JS和CSS等)
npm run build
# 单元测试
npm run unit
# 运行所有测试
npm test

参数和事件

Name Type Default Description
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表示星期一,其它依次类推

组件的所有属性值

props: {
 value: {
  type: [String, Date]
 },
 format: {
  default: 'yyyy-MM-dd'
 },
 firstDayOfWeek: {
  // sunday
  default: 0
 },
 disabledDaysOfWeek: {
  type: Array,
  default () {
  return []
  }
 },
 width: {
  type: String,
  default: '200px'
 },
 clearButton: {
  type: Boolean,
  default: false
 },
 inputClasses: {
  type: String,
  default: ''
 },
 lang: {
  type: String,
  default: navigator.language
 },
 placeholder: {
  type: String
 },
 hasInput: {
  type: Boolean,
  default: true
 },
 pane: {
  type: Number,
  default: 1
 },
 borderWidth: {
  type: Number,
  default: 2
 },
 onDayClick: {
  type: Function,
  default () {}
 },
 changePane: {
  type: Function,
  default () {}
 },
 specialDays: {
  type: Object,
  default () {
  return {}
  }
 },
 rangeBus: {
  type: Function,
  default () {
  // return new Vue()
  }
 },
 rangeStatus: {
  type: Number,
  default: 0
 },
 onDrawDate: {
  type: Function,
  default () {}
 },
 maxDate: {
  type: String
 },
 minDate: {
  type: String
 },
 showDateOnly: {
  type: Boolean,
  default: false
 },
 transfer: {
  type: Boolean,
  default: false
 },
 elementId: [String]
 }

五,源码

以下是我改过后的源码:

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

总结

以上所述是小编给大家介绍的基于Vue2-Calendar改进的日历组件(含中文使用说明),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript 动态创建表格的2种方法总结
Mar 04 Javascript
jQuery实现带有洗牌效果的动画分页实例
Aug 31 Javascript
JS中递归函数
Jun 17 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
js a标签点击事件
Mar 30 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
js中url对象化管理分析
Dec 29 Javascript
微信小程序实现自定义加载图标功能
Jul 19 Javascript
ES6 中可以提升幸福度的小功能
Aug 06 Javascript
vue实现移动端悬浮窗效果
Dec 01 Javascript
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 #Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 #Javascript
js中async函数结合promise的小案例浅析
Apr 14 #Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 #Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 #Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 #Javascript
JS实现倒序输出的几种常用方法示例
Apr 13 #Javascript
You might like
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
JS 控件事件小结
2012/10/31 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
DOM 事件流详解
2015/01/20 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
python修改字典内key对应值的方法
2015/07/11 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
如何写好建议书
2014/03/13 职场文书
2014年信访工作总结
2014/11/17 职场文书
明星邀请函
2015/02/02 职场文书
学生会主席任命书
2015/09/21 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
实现GO语言对数组切片去重
2022/04/20 Golang