vue 日历面板,vue实现一个炫酷的日历组件

  vue 日历面板,vue实现一个炫酷的日历组件

  最近做项目的时候需要做一个定制的日历组件。本文主要介绍从零开始编写的vue日历组件,通过示例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。

  :

目录

   1.前言2。vue日历制作2.1制作月份选择器2.2制作日历2.2.1获取当前月份要显示的日期2.2为不同的日期添加不同的样式2.3合并月份选择器和日历组件2.4编辑功能

  

1. 前言

  最近在做项目的时候遇到一个定制日历组件的需求(项目用的UI框架满足不了需求,算了,我直说了吧。蚂蚁设计vue的日历组件真的很丑,我自己写了一个),如下图。需求大致如下:

  (2)日历可以按月进行逐月切换。

  (2)按月显示周一至周日的排班信息。

  (3)排班信息分为早班和晚班。

  (4)按日期给排班着色:当月排班信息为正常颜色,今天显示深色,其他月份显示浅色。

  (5)点击编辑按钮,日历将进入编辑模式。简单来说,选择按钮显示在今天和今天之后的日程安排的右侧。单击它后,会显示一个框来编辑当天的日程。

  如果只需要日历组件部分,可以直接看2.2部分,只需要传递当前时间(一个包含当前年份和月份的对象),即可展示完整的当前月日历。

  

2. vue日历制作

  因为项目用的是ant desgin vue框架,所以会有a-row,a-col,a-card等标签。如果使用elementUI,只需将标签替换为el-row、el-col、el-card等相应的标签即可。

  

2.1 制作月份选择器

  效果图:

  根据要求,我们首先需要做一个月份选择器,用来提供月份切换,默认显示当前月份。点击左边的箭头前进一个月,点击右边的箭头后退一个月,每次点击都会抛出changeMonth函数,携带对象时间,包括当前月份选择器的年份和月份。

  模板

  !-月份选择器,支持左右箭头修改月份-

  div class=month-con

  a-icon type= left @ click= reduce month()/

  span class=月

  {{ time.year }}年{{

  时间。1 9月?时间.月1:“0”(时间.月1)

  }}月/span

  a-icon type= right @ click= add month()/

  /div

  /模板

  脚本

  导出默认值{

  data() {

  返回{

  时间:{

  年份:新日期()。getFullYear(),

  月:新日期()。getMonth()

  }

  }

  },

  已创建(){},

  方法:{

  reduceMonth() {

  如果(this.time.month 0) {

  this . time . month=this . time . month-1

  }否则{

  this.time.month=11

  这一年=这一年- 1

  }

  这个。$emit(changeMonth ,this.time)

  },

  addMonth() {

  如果(这一次.月11日){

  此时月=此时月1

  }否则{

  this.time.month=0

  这一年=这一年

  }

  这个。$emit(changeMonth ,this.time)

  }

  }

  }

  /脚本

  style lang=less 范围。月结

  字体粗细:700;

  字体大小:18px。月份{

  边距:0 10px

  }

  }

  /风格

  

2.2 制作日历

  

2.2.1 获取当前月所要显示的日期

  在制作日历之前,我们可以先看看电脑自带的日历。经过观察,我们可以发现以下规律:

  (1)虽然每个月的总天数不同,但统一显示6行,共计42天。

  (2)当月的第一天在第一行,当1号不是周一时,用上月的日期补全周一到1号的时间。

  (3)第五行和第六行不属于当月,用下个月的日期完成。

  因此,参照上述规则,在获取当月需要显示的日期时,可以遵循以下步骤:

  (1)获取当月第一天所在的日期和星期几。

  (2)当月第一天的天数减1就是之前要填的天数。从当月的第一天减去这个天数就是要显示的日历的开始日期。例如,上述日历的开始日期是1月31日。

  (3)循环42次,从开始日期开始,每次加一天,将这42天的日期保存到一个数组中,这个数组就是日历中要显示的当月的所有日期。

  (4)因为每次切换月份都会刷新日历,所以日历数组可以直接写成computed属性。

  计算值:{

  //获取当月的显示日历,共42天

  visibleCalendar: function() {

  const calendarArr=[]

  //获取当月的第一天

  const currentFirstDay=新日期(this.time.year,this.time.month,1)

  //获取第一天是星期几

  const weekDay=current first day . getday()

  //从当前月的第一天减去前一周的天数,这是您看到的日历的第一天。

  const start day=current first day-(weekDay-1)* 24 * 3600 * 1000

  //我们用42天来显示当前显示日历。

  for(设I=0;i 42i ) {

  常数日期=新日期(开始日期i * 24 * 3600 * 1000)

  calendarArr.push({

  日期:新日期(startDay i * 24 * 3600 * 1000),

  year: date.getFullYear(),

  month: date.getMonth(),

  day: date.getDate()

  })

  }

  返回日历Arr

  }

  }

  

2.2.2 给不同的日期添加不同的样式

  效果图:

  根据要求,我们需要为不同的日期添加不同的样式:

  (1)当前月调度信息正常颜色

  (2)今天天黑了。

  (3)其他月份呈现浅色。

  因此,当我们获取当前月份的日历数组时,我们可以将每一天与今天的日期进行比较,以便添加不同的属性来获取和添加不同的样式:

  (1)如果是当前月份,thisMonth属性为thisMonth,否则为空;

  (2)如果是当天,isToday的属性为isToday,否则为空;

  (3)如果是当月,则afterToday属性为afterToday,否则为空;

  计算值:{

  //获取当月的显示日历,共42天

  visibleCalendar: function() {

  //获取今天的日、月、日

  const today=新日期()

  today.setHours(0)

  today . set分钟数(0)

  today.setSeconds(0)

  today . set毫秒(0)

  const calendarArr=[]

  //获取当月的第一天

  const currentFirstDay=新日期(this.time.year,this.time.month,1)

  //获取第一天是星期几

  const weekDay=current first day . getday()

  //从当前月的第一天减去前一周的天数,这是您看到的日历的第一天。

  const start day=current first day-(weekDay-1)* 24 * 3600 * 1000

  //我们用42天来显示当前显示日历。

  for(设I=0;i 42i ) {

  const date=新日期(开始日期i * 24 * 3600 * 1000)

  calendarArr.push({

  日期:新日期(startDay i * 24 * 3600 * 1000),

  year: date.getFullYear(),

  month: date.getMonth(),

  day: date.getDate(),

  //是在当月吗?

  本月:

  date . get full year()===today . get full year()

  date . getmonth()===today . getmonth()

  ?这个月

  : ,

  //是今天吗?

  今天:

  date . get full year()===today . get full year()

  date . getmonth()===today . getmonth()

  date.getDate()===today.getDate()

  ?“今天”

  : ,

  //是今天之后吗?

  after today:date . gettime()=today . gettime()?今天之后 :

  })

  }

  返回日历Arr

  }

  }

  日历组件的vue代码如下。测试时,可以先将时间的默认值设置为当前月份:

  模板

  差异

  实际行数

  !-左边显示早班、晚班或上下午班-

  a-col :span=2

  div class=日期提示

  a-col

  v-for=第6项

  :key=item

  本月提示日期

  :span=1

  早班

  夜班

  /a列

  /div

  /a列

  !-右边,周一至周五,具体内容-

  span=22

  !-第一行表头,周一到周日-

  div class=top-con

  div class= top v-for= item in top :key= item 星期{{ item }}/div

  /div

  !-日历号-

  div class=date-con

  差异

  class=date

  :class=[item.thisMonth,item.isToday,item.afterToday]

  v-for=(item,index) in visibleCalendar

  :key=index

  div{{ item.day }}/div

  早上好张三,李四/div

  晚上王五,赵六/div

  /div

  /div

  /a列

  /a行

  /div

  /模板

  脚本

  //从""导入实用工具 utils.js

  导出默认值{

  道具:{

  时间:{

  类型:对象,

  默认值:()={

  返回{}

  }

  }

  },

  data() {

  返回{

  顶部:[一, 二, 三, 四, 五, 六, 日]

  }

  },

  已创建(){

  console.log(123 ,this.time)

  },

  方法:{

  //获取

  },

  计算值:{

  //获取当前月份显示日历,共42天

  visibleCalendar: function() {

  //获取今天的年月日

  今日常量=新日期()

  today.setHours(0)

  今天。设置分钟数(0)

  today.setSeconds(0)

  今天。设置毫秒(0)

  const calendarArr=[]

  //获取当前月份第一天

  const currentFirstDay=新日期(本.时.年,本.时.月,1)

  //获取第一天是周几

  常量工作日=当前第一天。getday()

  //用当前月份第一天减去周几前面几天,就是看见的日历的第一天

  常数开始日=当前第一天-(工作日-1)* 24 * 3600 * 1000

  //我们统一用42天来显示当前显示日历

  对于(设I=0;i 42i ) {

  常数日期=新日期(开始日期i * 24 * 3600 * 1000)

  calendarArr.push({

  日期:新日期(startDay i * 24 * 3600 * 1000),

  year: date.getFullYear(),

  month: date.getMonth(),

  day: date.getDate(),

  //是否在当月

  本月:

  约会。获取全年()===今天。获取整年()

  约会。getmonth()===今天。getmonth()

  ?这个月

  : ,

  //是否是今天

  今天:

  约会。获取全年()===今天。获取整年()

  约会。getmonth()===今天。getmonth()

  date.getDate()===today.getDate()

  ?"今天"

  : ,

  //是否在今天之后

  今天之后:日期。gettime()=今天。gettime()?今天之后 :

  })

  }

  返回日历arrive)

  }

  }

  }

  /脚本

  style lang=less 范围。顶级欺诈

  显示器:flex

  对齐-项目:居中;顶部{

  宽度:14.285%;

  背景色:rgb(242,242,242);

  填充:10px 0;

  保证金:5px

  文本对齐:居中;

  }

  }。日期会议{

  显示器:flex

  柔性包装:缠绕;日期{

  宽度:14.285%;

  文本对齐:居中;

  填充:5px。早上好

  填充:10px 0;

  背景色:rgba(220,245,253,0.3);

  }。晚上{

  填充:10px 0;

  背景色:rgba(220,244,209,0.3);

  }

  }。本月{。早上好

  背景色:rgb(220,245,253);

  }。晚上{

  背景色:rgb(220,244,209);

  }

  }。今天{

  字体粗细:700;早上好

  背景色:rgb(169,225,243);

  }。晚上{

  背景色:rgb(193,233,175);

  }

  }

  }。提示-con {

  边距-顶部:51px。提示{

  边距-顶部:21px

  宽度:100%;

  }

  }

  /风格

  

2.3 将月份选择器和日历组件组合使用

  效果示意图:

  组合代码如下:

  模板

  差异

  a卡

  !-操作栏-

  a行type=" flex " justify=" space-around "

  a列:span=12

  !-月份选择器-

  月份选择器@更改月份=更改月份/月份选择器

  /a列

  a-col:span=12 /a-col

  /a行

  !-日历栏-

  a-row class=calendar-con

  日历:time=time/calendar

  /a行

  /a卡

  /div

  /模板

  脚本

  //月份选择器

  从导入Monthpicker。/components/Monthpicker.vue

  //日历组件

  从导入日历。/components/Calendar.vue

  导出默认值{

  组件:{

  monthpicker: Monthpicker

  日历:日历

  },

  data() {

  返回{

  时间:{

  年份:新日期()。getFullYear(),

  月:新日期()。getMonth()

  }

  }

  },

  已创建(){},

  方法:{

  //修改月份

  更改月份(时间){

  console.log(time ,time)

  this.time=时间

  }

  }

  }

  /脚本

  style lang=less 范围。月结

  字体粗细:700;

  字体大小:18px。月份{

  边距:0 10px

  }

  }。日历-con {

  边距-顶部:20px

  }

  /风格

  通过changeMonth事件,月份选择器中的月份被传递给calendar组件,从而完成了一个可以修改月份的简单calendar组件。

  

2.4 编辑功能

  效果图:

  根据需求,我们还需要能够编辑日历的内容。具体来说,您需要在日历上方添加一个编辑按钮,然后单击它将日历切换到编辑模式。事实上,在每个网格的职责信息后都会显示一个选择按钮。点击后会弹出一个框或者跳转到编辑页面,用于修改当前网格的值班信息。修改后点击保存,关闭弹出框或返回日历页面,重新查询当前日历值班信息。

  当然,以上只是实现编辑功能的一种方式。如果网格中只有文本信息,不涉及复杂的绑定,也可以点击编辑按钮,将每个网格转换成一个输入框,并在右侧添加保存按钮(或者在日历上方添加一个通用的保存按钮)。编辑后,单击保存,然后恢复到文本形式。

  注意:通常只有今天和今天之后的值班信息可以编辑,因此之前的日历数组中的每个日期对象我们都保存了一个afterToday属性,可以用于判断是否渲染选择按钮。因为编辑功能太简单,我就不写代码演示了。

  这就是这篇关于从头开始编写vue日历组件的文章。更多相关vue日历内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: