vue展示日历 考勤展示_vue实现日历组件
1、当前组件说明
一个用vue实现的简单日历组件,可以手动设置日历的宽高,未设置时,有默认宽高,设置后,其中的每个日期项的宽高可以根据设定的宽高自适应、可以设置当前选中日期,可以设置时间可用范围,可以通过左右箭头进行日期切换。(第一次使用简书,代码格式比较丑,而且换行很高,也不知道怎么调整,大家见谅)
2、组件效果展示
3、组件实现代码
{{vdpYear + '年' + vdpMonth + '月'}}
: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实现日历组件相关推荐
- vue展示日历 考勤展示_VUE实战—菜单栏商品展示数据交互(8)
上篇我们将菜单栏,商品展示结构完成,本次我们为这两个部分接入数据. 菜单栏接入数据 导入组件,定义需要的数据格式 <script> // 导入BScroll 滚动组件 import BSc ...
- vue展示日历 考勤展示_基于element-ui的日历显示当月考勤情况
前言:element-ui 日历组件calendar 自定义使用,做一个显示当月考勤情况的功能. 效果图: 准备工作: element-ui的版本最少是2.8.2,由于之前我安装的版本是2.4.2版本 ...
- java和vue实现拖拽可视化_Vue拖拽组件开发实例详解
摘要:这篇Vue栏目下的"Vue拖拽组件开发实例详解",介绍的技术点是"Vue拖拽组件开发实例.vue拖拽组件.拖拽组件.组件开发.开发实例.实例详解",希望对 ...
- vue生成静态html文件_vue单文件组件,如何生成.html文件
vue-cli项目怎么生成.html文件? 项目使用了element-ui还有自定义的less文件 vue组件: 这是一段文字 ... 生成 ... ... handlerBulder () { co ...
- 仿钉钉考勤统计页面的日历组件,通过日历展示每日考勤打卡情况,支持在日历上打两种不同类型的点,大致适配各种分辨率效果图
原文链接:uniapp : 仿钉钉考勤统计页面的日历组件,通过日历展示每日考勤打卡情况,支持在日历上打两种不同类型的点,大致适配各种分辨率 - northwest - 博客园 (cnblogs.com ...
- vue工作日历考勤记录表
下载地址 基于vue试下的工作日历考勤记录表 dd:
- android 钉钉考勤日历,vue钉钉考勤日历 vue实现钉钉的考勤日历
想了解vue实现钉钉的考勤日历的相关内容吗,张张张立宏在本文为您仔细讲解vue钉钉考勤日历的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:vue钉钉考勤日历,vue钉钉考勤,vue考勤日历 ...
- layui日历形式展示对应可编辑表格数据
需求: 新增按钮弹框, 根据查询条件生成表格数据(日历形式展示),且数据与日历天数一一对应.数据都可一一修改,且监听单元格修改正则验证.如果当前单元格对应的日历形式非当月的数据展示为空,且不可编辑. ...
- vue 日历翻拍效果_VUE实现日历组件功能
哈哈, 就在昨天笔者刚刚在Github 上发布了一个基于VUE的日历组件.过去做日历都是需要引用 jquery moment 引用 fullCalendar.js 的.几者加起来体积庞大不说,也并不是 ...
最新文章
- linux运维前景与运维人员最佳职业规划录像
- 洛谷P1071 潜伏者 字符串
- ios 获取一个枚举的所有值_Java enum枚举在实际项目中的常用方法
- android 布局滑动中scrollTo 和 scrollBy 方法使用说明
- 速达服务器账套定期维护么,速达软件常见操作问题解决方法
- Flutter+Serverless端到端研发架构实践
- Spring AOP源码解析——专治你不会看源码的坏毛病!
- matplotlib mysql_matplotlib简介
- 短视频出海,风云再起
- 数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案
- EasyPR--开发详解
- 2022年 javaJDK下载安装步骤及环境变量配置【超详细】
- 关于C语言的字符常量和符号常量
- chm 打不开 解决办法
- matlab解方程 中det,matlab中det函数
- user declined directory sharing Creating xxxx
- Linux bpf 1.1、BPF内核实现
- openid php steam,在Android中使用openID进行Steam登录
- Cisco Packet Tracer vty的两种接口
- android 生成aar文件,Android 中.aar文件生成方法与用法
热门文章
- 【AAAI 2021】多出口架构的知识蒸馏:Harmonized Dense Knowledge Distillation Training for Multi-Exit Architectures
- QT与MATLAB混合编程
- 碳基计算机电路,碳基CMOS集成电路技术
- Gradle Composite builds 扩展使用
- ip route 命令的作用详解
- 【步态识别】LagrangeGait基于拉格朗日《Lagrange Motion Analysis and View Embeddings for Improved Gait Recognition》
- 转 给SSD(固态硬盘)编程
- JSP设置Excel表格换行_Excel中快速将阿拉伯数字转化为大写文字的妙招
- 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素
- 100-days: twenty-four