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

一,前言

我是刚学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  <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代码:

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

2.常规使用,双月日历

HTML代码:

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

JS代码:

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

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

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

HTML代码:

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             <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代码:

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

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

安装(需要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" >
<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://www.cnblogs.com/alax/p/10649295.html

时间: 2024-10-08 13:01:15

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

vue2.0项目 calendar.js(日历组件封装)

最近一直闲来无事,便寻思着做一下自己的个人项目,也想说能使用现在比较流行的一些mvvm框架来做,于是就选用了这样的一个技术栈vue2.0+vue-router+vuex+webpack来做,做得也是多页面应用,使用vue-router,也是想说把多个功能模块化,单个模块spa,实现更高的效果.当然现在还在做的过程中,如果感兴趣可以过来star一下,哈哈,https://github.com/xiaobinwu/Wuji,git clone下来看看. 今天要说的是在做这个项目的过程中,自己想加一个

第二百一十四节,jQuery EasyUI,Calendar(日历)组件

jQuery EasyUI,Calendar(日历)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Canlendar(日历)组件的使用方法,这个组件不依赖于其 他组件. 一.加载方式 class 加载方式 <div id="box" class="easyui-calendar" style="width:200px;height:200px;"></div>

javascript动手写日历组件(3)——内存和性能优化(by vczero)

一.列表 javascript动手写日历组件的文章列表,主要是通过原生的JavaScript写的一个简约的日历组件: (1)javascript动手写日历组件(1)——构建日历逻辑:http://www.cnblogs.com/vczero/p/js_ui_1.html (2)javascript动手写日历组件(2)——优化UI和添加交互:http://www.cnblogs.com/vczero/p/js_ui_2.html (3)javascript动手写日历组件(2)——内存和性能优化:h

javascript动手写日历组件(2)——优化UI和添加交互(by vczero)

一.优化UI 继上一篇,http://www.cnblogs.com/vczero/p/js_ui_1.html.开始优化UI,主要优化的部分有: (1)增加星期行.(2)字体设置.(3)日期垂直居中.(4)将单元格->底部线条.(5)修改文本的颜色对比.(6)将内部调用的函数加前缀_,如_addHeader()._addWeekday(). 修改的后基本效果如下图: 整个代码做了小修小改: 1 var Calendar = function(div){ 2 this.div = documen

javascript动手写日历组件(1)——构建日历逻辑 (by vczero)

一.分析日历的组成部分和交互要素 (1)组成部分:选择年月部分.星期显示.包含本月(或者有前月和下一个月部分日子) (2)根据选择的年和月份,动态绘制日历面板. (3)一个日历 7(天) * 5(周) = 35格表格. (4)一个月份是统一的一个面板:一个月的头一天一定在日历面板的第一行,根据该天的“星期几”确定位置. (5)第一格子是星期一,最后一个格子是星期日,为5周的日历面板. 二.确定逻辑设计 日历上面的日历,8月1号建军节为什么会出现在这一格?因为一个月的天数是小于5周(35天)的,因

vue初学实践之路——vue简单日历组件

---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不需要用到node服务器,只需要一个Html文件即可. 项目基本目录 首先在引入 vue.js <script src="https://unpkg.com/vue/dist/vue.js"></script> 贴上最主要的html和js代码 <div id=&

iKcamp|基于Koa2搭建Node.js实战(含视频)? 记录日志

沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分,版本迭代和后期维护占了极其重要的部分.项目上线运转起来之后,我们如何知道项目运转的状态呢?如何发现线上存在的问题,如何及时进行补救呢?记录日志就是解决困扰的关键方案.正如我们每天写日记一样,不仅能够记录项目每天都做了什么,便于日后回顾,也可以将做错的事情记录下来,进行自我反省.完善的日志记录不仅能

vue-piczoom 基于vue2.x的电商图片放大镜插件

vue-piczoom:基于vue2.x的电商图片放大镜插件 最近在撸一个电商网站,有一个需求是要像淘宝商品详情页那样,鼠标放在主图上,显示图片放大镜效果,找了一下貌似没有什么合适的vue插件,于是自己撸了一个,分享一下.小白第一次分享,各位大神莫见笑. vue-piczoom A picture magnifier component for Vue.js 2.x基于vue2.x的电商图片放大镜插件 Build Setup 使用步骤 # 安装 install npm install vue-p

Vue自定义日历组件

今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart="true" :calendarType="1" :markDate="markDate" :markDateClass="markDateClass" :agoDayPrevent="agoDayPrevent&qu