一、前言

别人的东西用起来总是那么的不顺手,UI库的日历组件竟然不返回星期几,完全无法忍受,于是自己动手写了一个日历组件。
自己写的东西,那就是想怎么搞就怎么搞,哈哈哈哈哈。

二、代码

我使用的navie的按钮和tailwind的css,替换起来很方便的。

<template><div class="w-full p-2"><h1 class="w-full flex justify-between items-center my-2 px-3 h-10 "><span class="text-2xl leading-10 font-semibold">{{ nian + " " + hanziyue + "月" }}</span><n-button-group><n-button @click="gaimonth(-1)" round><span>{{"<"}}</span><span>{{"<"}}</span><span>上个月</span></n-button><n-button @click="gaimonth(1)" round><span>下个月</span><span>{{">"}}</span><span>{{">"}}</span></n-button></n-button-group><n-button @click="getnianyueri()" type="primary">回到今天</n-button></h1><div class="w-full flex flex-wrap justify-start items-start"><div class="w-1/7 min-w-32  h-32 border border-gray-300 cursor-pointer" v-for="item in daylist" :key="item.timestamp" :class="item.month!==yue?'text-gray-400':''" @click="clickevent(item)"><div class="w-full h-5 flex justify-between items-center p-1"><span>{{item.day}}</span><span v-if="item.day===xianzaitime.ri && item.month===xianzaitime.yue && item.year===xianzaitime.nian" class="text-blue-600">今天</span><span>{{item.zhou}}</span></div><slot :year="item.year" :month="item.month" :day="item.day" :week="item.week"></slot></div></div></div>
</template><script setup>
import {computed, ref,defineEmits} from "vue";
import {useStore} from "vuex"
import {useRoute, useRouter} from "vue-router"
import numtozh from "../../util/numtozh";
import weektozh from "../../util/weektozh";
import {NButton,NButtonGroup} from "naive-ui"
const store = useStore()
const router = useRouter()
const route = useRoute()
const emit = defineEmits(["handleclick","changemonth"])
// 需要展示的所有日期列表
const daylist = ref([])
// 年月日数据暂存
const shijian = ref(null)
const nian = ref(null)
const yue = ref(null)
const ri = ref(null)
const getnianyueri = (canshu = null) => {// 置空日期列表daylist.value = []if (canshu) {shijian.value = new Date(canshu)} else {shijian.value = new Date();}nian.value = shijian.value.getFullYear()yue.value = shijian.value.getMonth() + 1ri.value = shijian.value.getDate()// 当前显示月份改变后,需要向父组件抛出,父组件可以根据月份更新日程emit("changemonth",{year:nian.value,month:yue.value})tianchong()
}
// 计算需要展示的第一个日期
const startandendday=()=>{const cloneNowDate = new Date(shijian.value);// 先获取这个月的第一天const firstdaytime = cloneNowDate.setDate(1)// 获取第一天是周几  ,修改2021年7月26日 14:42:58,周日是0不是7,我草。let firstdayweek = new Date(firstdaytime).getDay()if(firstdayweek===0){firstdayweek=7}// 展示时间的第一天return firstdaytime - (firstdayweek - 1) * 24 * 60 * 60 * 1000
}
// 向列表填充数据
const tianchong=()=>{const starttime = startandendday()console.log(starttime,"开始时间")for (let i=0;i<=60;i++){let shuju = {}const shijianchuo = starttime + i*24*60*60*1000const sj = new Date(shijianchuo)const nian1 = sj.getFullYear()const yue1 = sj.getMonth() +1const ri1 = sj.getDate()const week = sj.getDay()if(yue.value===1){if(yue1>yue.value && yue1 !== 12){if(week===1 || week ===7){break}}}else if(yue.value===12){if(yue1-yue.value===-11){if(week===1 || week ===7){break}}}else{if(yue1>yue.value){if(week===1 || week ===7){break}}}shuju["timestamp"] = shijianchuoshuju["year"] = nian1shuju["month"] = yue1shuju["day"] = ri1shuju["week"] = weekshuju["zhou"] = weektozh(week)daylist.value.push(shuju)}
}
// 日期点击事件
const clickevent=(item)=>{emit("handleclick",item)// 如果点击的日期不是当前月的,修改当前时间if(item.month !== yue.value){getnianyueri(item.timestamp)}
}
// 数字转汉字
const hanziyue = computed(()=>{return numtozh(yue.value)
})
// 点击上个月或者下个月
const gaimonth=(num)=>{let newmonth = yue.value + num// 如果大于12,转到下一年if(newmonth>12){nian.value += 1newmonth = 1}const sj = new Date(Date.parse(nian.value+"/"+newmonth+"/"+ri.value)).getTime()getnianyueri(sj)
}
// 获取今天的时间
const xianzaitime = ref({})
const getnow = ()=>{const sj = new Date()xianzaitime.value["nian"] = sj.getFullYear()xianzaitime.value["yue"] = sj.getMonth() +1xianzaitime.value["ri"] = sj.getDate()
}
// 初始化区域
getnow()
getnianyueri()
</script><style scoped></style>

引入的两个方法的代码

/*
* 数字转汉字,就是顶部显示的月份,数字不好看,换成汉字
* */
const dict = {0: "零",1: "壹",2: "贰",3: "弎",4: "肆",5: "伍",6: "陆",7: "柒",8: "捌",9: "玖",10: "拾",11: "拾壹",12: "拾贰",
}
export default function (num){return dict[num];
}
/*
* 数字转汉字,就是每个日期右上角显示的周几
* */
const dict2 = {1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",0:"周日",
}
export default function (num){return dict2[num]
}

三、使用方法

<rili @handleclick="showtime" @changemonth=“getdata”><template v-slot="yuansu"><div class="w-full h-full px-2 mt-1 overflow-x-hidden overflow-y-auto"><span>{{yuansu.year}}-{{yuansu.month}}-{{yuansu.day}}</span><p>自定义内容</p></div></template></rili>

四、效果图

五、结束

有问题或者意见可以提。

自定义vue3.0日历组件相关推荐

  1. vue 添加全局组件_自定义vue2.0全局组件(下篇)

    在上篇中,老K为大家介绍了一个初级自定义按钮组件的编写方法.虽然能用,但是还不算完美,可扩展性不够强大.在这一篇中,老K继续为大家完善这个按钮组件. 启动命令窗口, 进入在上篇中我们搭建的vue目录中 ...

  2. vue3.0父子组件的通信

    vue3.0父子组件的通信 Vue3.0组件通信 Vue3.0组件通信 vue3.0脚手架setup内部的组件通信 1.父到子通过props 父组件 <template><div & ...

  3. vue3.0 父组件调用子组件方法及获取子组件的值

    vue3.0 父组件调用子组件方法及获取子组件的值 通过对比2.0的获取及调用方式这里我们也可以借鉴2.0中的this.$refs去获取3.0和2.0的refs获取的方式有点大同小异,但是思路还是一样 ...

  4. vue3.0 父子组件通信

    子传父:子组件调用父组件方法 vue3.0不再支持this,所以this.$emit()方法不在被支持. 以下为VUE3.0新写法 子组件: <script> import { defin ...

  5. vue3.0 父子组件传值问题

    使用vue3.0时遇到父子传值的问题,顺便记录一下 问题背景: 如图所示,编辑按钮是父组件的部分,下面的表单是子组件 需要:按下父组件中的编辑按钮时,子组件的表单需要变成可编辑状态,在可编辑状态下按下 ...

  6. vue3.0子组件向父组件传值-发布订阅者模式

    子组件向父组件传值-context.emit 子组件向父组件传值 context.emit 子组件向父组件传值 context.emit 子组件中: 将数据terminationOpinion传给父组 ...

  7. vue3.0 子组件调用父组件中的方法

    在vue2中,子组件调用父组件,直接使用this.$emit()即可. 但是在vue3中,很显然使用this.$emit() 已经开始报错了,为什么会报错呢? 原因是:在vue3中setup是在声明周 ...

  8. vue3使用的移动端UI框架,vue3.0 ui组件库

    vue 3.0 项目中 element-ui form 表单元素中 仅 el-button 显示,其他不显示,如何解决? 谷歌人工智能写作项目:小发猫 在页面中引用了laydate插件,在显示的时候, ...

  9. vue3.0分页组件

    <template><div class="xtx-pagination"><a href="javascript:;" @cli ...

最新文章

  1. 独家 | 2种数据科学编程中的思维模式,了解一下(附代码)
  2. linux下apache服务器的配置和管理(启动、重启、中断服务)
  3. 洛谷 P3368 【模板】树状数组 2
  4. easypoi导出word表格_拒绝加班,批量将word文档中的信息高效率提取出来存储到Excel中...
  5. 爬虫学习之-Python list 和 str 互转
  6. Spark的存储管理
  7. 锌离子荧光探针Zinquin 乙酯
  8. 神州数码交换机enable密码清除
  9. 【矩阵论】矩阵的相似标准型(4)(5)
  10. 深圳大学《计算机论题》作业:伦理分析的一般框架进行案例分析
  11. ftm国际化解决方案
  12. 机器视觉学习笔记(三)-- 图像采集(镜头)
  13. python金融数据爬虫与数据分析学习(一)
  14. iOS-微信朋友圈图片压缩算法
  15. 铁道部购票网站可能造成另一次的密码危机
  16. 非结构数据分析与建模——垃圾短信数据集
  17. Android-传感器开发-方向判断
  18. Oracle数据库网络详解
  19. [转发]贝茨方法改善视力的几种方法
  20. Unity读写飞控参数mavlink

热门文章

  1. 开源自主导航小车MickX4(一)ROS底盘硬件
  2. php程序员的出路,php程序员有前途吗
  3. 本机修改虚拟机linux中的代码文件
  4. 阿里云数据库(RDS)查看空间使用情况
  5. 函数的定义以及关键字参数
  6. Jenkins在搭建过程中遇到的一些问题
  7. 两种批处理方式(操作系统)
  8. 【Monkey测试】Monkey测试详解
  9. iqn怎么查 linux_Linux下配置iscsi-initiator - 存储资源
  10. AE开发 遇到未能加载文件或程序集的问题 FileNotFoundException