1、当前组件说明

一个用vue实现的简单日历组件,可以手动设置日历的宽高,未设置时,有默认宽高,设置后,其中的每个日期项的宽高可以根据设定的宽高自适应、可以设置当前选中日期,可以设置时间可用范围,可以通过左右箭头进行日期切换。(第一次使用简书,代码格式比较丑,而且换行很高,也不知道怎么调整,大家见谅)

2、组件效果展示

3、组件实现代码

{{vdpYear + '年' + vdpMonth + '月'}}

{{item}}

:style="itemStyles"

v-for="(item, i) in dateList" :key="i" @click="toSelect(item)"

:class="(item.disabled === false && item.actived ? 'actived' :'grey') + (item.checked ? ' checked' : '') + (item.today ? ' today' : '') + (item.disabled ? ' disabled' : '')">

{{item.day}}

export default {

name: 'cDatePicker',

props: {

// 要求传入的值 必须为 yyyy-MM-dd 格式数据

value: {

type: String

},

// 日历显示的宽度,默认300px

width: {

type: Number,

default: 300

},

// 日历显示的高度,默认300px

height: {

type: Number,

default: 300

},

// 日历工具栏的显示高度,默认32px

toolHeight: {

type: Number,

default: 32

},

// 日历中每个时间项的行高

lineHeight: {

type: Number

},

margin: {

type: Number,

default: 2

},

// 日历可选范围-开始时间

start: {

type: String,

default: ''

},

// 日历可选范围-结束时间

end: {

type: String,

default: ''

}

},

watch: {

// 监听 外部插入的value值变化

// value (n, l) {

//   this.init()

// }

},

data () {

return {

xqList: ['日', '一', '二', '三', '四', '五', '六'],

vdpYear: 0, // 选择的年

vdpMonth: 0, // 选择的月

vdpDay: 0, // 选择的日

monthStart: 0, // 月初

monthEnd: 0, // 月末

monthWeek: 0,

dateList: [] // 当前时间集合

}

},

methods: {

// 初始化

init () {

const now = this.newDate(this.value || undefined)

this.vdpYear = now.getFullYear()

this.vdpMonth = now.getMonth() + 1

this.vdpDay = this.value ? now.getDate() : 0

this.computePicker()

},

// 选中某一天

toSelect (item) {

if (item && item.disabled === false) {

// // 通过重新生成dateList数据 达到改变选中效果

// this.vdpDay = item.day

// this.computePicker()

// 通过 直接循环修改dateList数据 达到改变选中效果

this.dateList = this.dateList.map(v => {

v.checked = false

return v

})

this.vdpDay = item.day

item.checked = true

this.$emit('input', item.date)

this.$emit('on-change', item.date, this.newDate(item.date))

}

},

// 上一个月

toVdpUpper () {

if (this.vdpMonth > 1) {

this.vdpMonth--

} else {

this.vdpYear--

this.vdpMonth = 12

}

this.vdpDay = 0

this.computePicker()

},

// 下一个月

toVdpLower () {

if (this.vdpMonth

this.vdpMonth++

} else {

this.vdpYear++

this.vdpMonth = 1

}

this.vdpDay = 0

this.computePicker()

},

// 计算月初、月末、月初是星期几及当前日期数据

computePicker () {

const yc = new Date(this.vdpYear, this.vdpMonth - 1, 1) // 月初

const ym = new Date(this.vdpYear, this.vdpMonth, 0) // 月末

this.monthStart = yc.getDate()

this.monthEnd = ym.getDate()

this.monthWeek = yc.getDay()

const v = []

for (let i = 0; i

v.push(this.getVdpDay(i, '-'))

}

this.dateList = v

},

// 获取当前日期 核心方法

getVdpDay (index, defV) {

let _disabled = false

let _actived = false

let _year = this.vdpYear

let _month = this.vdpMonth

let _day = 0

if (this.monthWeek === 0) {

index = index - 7

}

if (index

// 计算上月

_month--

if (_month === 0) {

_year--

_month = 12

}

_day = new Date(_year, _month, 0).getDate() - this.monthWeek + index + 1 // 算当前选中月的上一月 月末

} else if (index > (this.monthWeek + this.monthEnd - 1)) {

// 计算下月

_month++

if (_month === 13) {

_year++

_month = 1

}

_day = new Date(this.vdpYear, this.vdpMonth, 1).getDate() + index - (this.monthEnd + this.monthWeek) // 算当前选中月的下一月 月初

} else {

// 计算当月

_day = this.monthStart + index - this.monthWeek

_actived = true

}

// 计算开始日期和结束日期

if (this.start || this.end) {

const _curtm = new Date(_year + '/' + _month + '/' + _day)

if (this.start) {

const _start = this.newDate(this.start)

if (_curtm

_disabled = true

}

}

if (this.end) {

const _end = this.newDate(this.end)

if (_curtm > _end) {

_disabled = true

}

}

}

return { year: _year, month: _month, day: _day, date: this.generateDateStr(_year, _month, _day), checked: this.verifyCheckDate(_year, _month, _day), actived: _actived, today: this.isToday(_year, _month, _day), disabled: _disabled } // _disabled ? (defV || '') : _day

},

// 生成时间字符串

generateDateStr (year, month, day) {

return year + '-' + (month > 9 ? month : '0' + month) + '-' + (day > 9 ? day : '0' + day)

},

// 验证是否是当前选中的日期

verifyCheckDate (year, month, day) {

if ((this.value && this.value === this.generateDateStr(year, month, day)) || (this.vdpYear === year && this.vdpMonth === month && this.vdpDay === day)) {

return true

} else {

return false

}

},

// 验证是否今天

isToday (year, month, day) {

if (this.generateDateStr(year, month, day) === this.formatDate(new Date(), 'yyyy-MM-dd')) {

return true

} else {

return false

}

},

// 字符串转换 Date 解决ie11 时间兼容性问题

newDate (time, defV) {

let v = defV === undefined ? new Date() : defV

if (time) {

v = new Date(time.replace(/-/g, '/'))

}

return v

},

// 时间格式化 兼容IE

formatDate (date, format) {

if (date) {

var time

if (typeof date === 'string') {

time = new Date(date.replace(/-/g, '/'))

} else if (typeof date === 'object') {

time = new Date(date)

}

var o = {

'M+': time.getMonth() + 1, // 月份

'd+': time.getDate(), // 日

'h+': time.getHours(), // 小时

'm+': time.getMinutes(), // 分

's+': time.getSeconds(), // 秒

'q+': Math.floor((time.getMonth() + 3) / 3), // 季度

S: time.getMilliseconds() // 毫秒

}

if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + '').substr(4 - RegExp.$1.length))

for (var k in o) { if (new RegExp('(' + k + ')').test(format)) format = format.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }

return format

} else { return '' }

}

},

computed: {

itemStyles () {

const _w = (this.width / 7 - this.margin * 2)

const _h = ((this.height - this.toolHeight) / 7 - this.margin * 2)

const _lh = this.lineHeight ? this.lineHeight : (_h - 1) + 'px' // parseInt(_h)

return { width: _w + 'px', height: _h + 'px', margin: this.margin + 'px', 'line-height': _lh }

}

},

created () {

this.init()

}

}

.picker-box {

width: 100%;

height: 100%;

margin: 0 auto;

font-size: 14px;

}

.picker-box .picker-tool {

height: 50px;

line-height: 50px;

text-align: center;

}

.picker-box .picker-body {

width: 100%;

}

.picker-box .picker-body .picker-item, .picker-box .picker-body .picker-title  {

width: calc(14.285714285% - 10px);

height: calc(16.666666666% - 10px);

line-height: 2.6;

text-align: center;

border: 1px solid #ececec;

border-radius: 5px;

margin: 5px;

float: left;

}

.picker-box .picker-body .picker-item {

cursor: pointer;

}

.picker-box .picker-body .picker-title {

background: #eaf0f5;

}

.picker-box .picker-body .grey {

color: #b2b2b2;

border: 1px solid #ececec;

background: #fbfbfb;

}

.picker-box .picker-body .actived {

color: #3c3c3c;

border: 1px solid #ececec;

}

.picker-box .picker-body .today {

background: #d8f9d8;

border: 1px solid #ececec;

}

.picker-box .picker-body .checked {

color: #fff;

background: #19be6b;

border: 1px solid #19be6b;

}

.picker-box .picker-body .disabled {

color: #b2b2b2;

background: #f2f2f2;

border: 1px solid #ececec;

cursor: not-allowed;

}

4、组件调用示例

import cDatePicker from './cDatePicker'

export default {

components: {

cDatePicker

},

data () {

return {

timeText: '2020-07-16',

start: '2020-06-12',

end: '2020-08-05'

}

}

}

5、尚需待完善

a、点击年,进行年份切换

b、点击月,进行月份切换。

vue展示日历 考勤展示_vue实现日历组件相关推荐

  1. vue展示日历 考勤展示_VUE实战—菜单栏商品展示数据交互(8)

    上篇我们将菜单栏,商品展示结构完成,本次我们为这两个部分接入数据. 菜单栏接入数据 导入组件,定义需要的数据格式 <script> // 导入BScroll 滚动组件 import BSc ...

  2. vue展示日历 考勤展示_基于element-ui的日历显示当月考勤情况

    前言:element-ui 日历组件calendar 自定义使用,做一个显示当月考勤情况的功能. 效果图: 准备工作: element-ui的版本最少是2.8.2,由于之前我安装的版本是2.4.2版本 ...

  3. java和vue实现拖拽可视化_Vue拖拽组件开发实例详解

    摘要:这篇Vue栏目下的"Vue拖拽组件开发实例详解",介绍的技术点是"Vue拖拽组件开发实例.vue拖拽组件.拖拽组件.组件开发.开发实例.实例详解",希望对 ...

  4. vue生成静态html文件_vue单文件组件,如何生成.html文件

    vue-cli项目怎么生成.html文件? 项目使用了element-ui还有自定义的less文件 vue组件: 这是一段文字 ... 生成 ... ... handlerBulder () { co ...

  5. 仿钉钉考勤统计页面的日历组件,通过日历展示每日考勤打卡情况,支持在日历上打两种不同类型的点,大致适配各种分辨率效果图

    原文链接:uniapp : 仿钉钉考勤统计页面的日历组件,通过日历展示每日考勤打卡情况,支持在日历上打两种不同类型的点,大致适配各种分辨率 - northwest - 博客园 (cnblogs.com ...

  6. vue工作日历考勤记录表

    下载地址 基于vue试下的工作日历考勤记录表 dd:

  7. android 钉钉考勤日历,vue钉钉考勤日历 vue实现钉钉的考勤日历

    想了解vue实现钉钉的考勤日历的相关内容吗,张张张立宏在本文为您仔细讲解vue钉钉考勤日历的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:vue钉钉考勤日历,vue钉钉考勤,vue考勤日历 ...

  8. layui日历形式展示对应可编辑表格数据

    需求: 新增按钮弹框, 根据查询条件生成表格数据(日历形式展示),且数据与日历天数一一对应.数据都可一一修改,且监听单元格修改正则验证.如果当前单元格对应的日历形式非当月的数据展示为空,且不可编辑. ...

  9. vue 日历翻拍效果_VUE实现日历组件功能

    哈哈, 就在昨天笔者刚刚在Github 上发布了一个基于VUE的日历组件.过去做日历都是需要引用 jquery moment 引用 fullCalendar.js 的.几者加起来体积庞大不说,也并不是 ...

最新文章

  1. linux运维前景与运维人员最佳职业规划录像
  2. 洛谷P1071 潜伏者 字符串
  3. ios 获取一个枚举的所有值_Java enum枚举在实际项目中的常用方法
  4. android 布局滑动中scrollTo 和 scrollBy 方法使用说明
  5. 速达服务器账套定期维护么,速达软件常见操作问题解决方法
  6. Flutter+Serverless端到端研发架构实践
  7. Spring AOP源码解析——专治你不会看源码的坏毛病!
  8. matplotlib mysql_matplotlib简介
  9. 短视频出海,风云再起
  10. 数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案
  11. EasyPR--开发详解
  12. 2022年 javaJDK下载安装步骤及环境变量配置【超详细】
  13. 关于C语言的字符常量和符号常量
  14. chm 打不开 解决办法
  15. matlab解方程 中det,matlab中det函数
  16. user declined directory sharing Creating xxxx
  17. Linux bpf 1.1、BPF内核实现
  18. openid php steam,在Android中使用openID进行Steam登录
  19. Cisco Packet Tracer vty的两种接口
  20. android 生成aar文件,Android 中.aar文件生成方法与用法

热门文章

  1. 【AAAI 2021】多出口架构的知识蒸馏:Harmonized Dense Knowledge Distillation Training for Multi-Exit Architectures
  2. QT与MATLAB混合编程
  3. 碳基计算机电路,碳基CMOS集成电路技术
  4. Gradle Composite builds 扩展使用
  5. ip route 命令的作用详解
  6. 【步态识别】LagrangeGait基于拉格朗日《Lagrange Motion Analysis and View Embeddings for Improved Gait Recognition》
  7. 转 给SSD(固态硬盘)编程
  8. JSP设置Excel表格换行_Excel中快速将阿拉伯数字转化为大写文字的妙招
  9. 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素
  10. 100-days: twenty-four