问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...日历组件使用心得(可能用到的常用方法和如何添加监听)

发布网友 发布时间:2024-10-10 09:27

我来回答

1个回答

热心网友 时间:2024-11-13 17:34

最近接触到一个需求,做一个值班排班表,拿到低保真之后一直在考虑是如何实现这个排班表,考虑过自己写,也考虑过@fullcalendar/vue插件,经过一些评估之后最终选择了项目本身使用的element-ui组件库中Calendar日历组件,但是在使用过程中发现此组件api少的可怜,连基本的一些点击事件都没透传出来,这样就不太好去实现根据月份查询排班信息,但是作为前端老司机总归是能解决的。

解决方案想过有成功的,也有失败的,我都贴出来,可以看看。

1、方案一:computed子组件的curMonthDatePrefix,然后再用watch监听curMonthDatePrefix,结论:失败,对curMonthDatePrefix的watch没任何反应。

computed:{curMonthDatePrefix(){letmyCalendar=this.$refs.myCalendar;returnmyCalendar?myCalendar.curMonthDatePrefix:"";},},watch:{curMonthDatePrefix:{immediate:true,handler:function(newval,oldval){console.log("value",this.value);console.log("testnewval",newval);console.log("testoldval",oldval);},},},

2、方案二:像watch对象中某个属性一样,结论:失败,对curMonthDatePrefix的watch没任何反应。

watch:{"$refs.myCalendar.curMonthDatePrefix":{immediate:true,handler:function(newval,oldval){console.log("value",this.value);console.log("testnewval",newval);console.log("testoldval",oldval);},},},

3、方案三:使用vm.$watchAPI,结论:成功。

引用Calendar的组件:

mounted(){this.$watch(function(){//这就像监听一个未被定义的计算属性returnthis.$refs.myCalendar.curMonthDatePrefix;},function(newVal){//可在此事件中添加请求信息之类的方法console.log("curMonthDatePrefix",newVal);},{immediate:true});},

4、方案四:使用extends继承Calendar组件,其合并原则和Mixins类似。继承组件myCalendar.vue中添加watch监听curMonthDatePrefix,在监听事件中添加emit,结论:成功。这也是我最终采用的方式,这种方式还可以改写template,以便后期更好地扩展,同时在下面的代码中加了一下可能会用到的方法。

myCalendar.vue:

<script>import{Calendar}from"element-ui";exportdefault{name:"Calendar",extends:Calendar,watch:{curMonthDatePrefix:{immediate:true,handler:function(){this.$emit("curMonthDatePrefixChange",this.curMonthDatePrefix);},},},};</script>

引用myCalendar的组件:

<template><div><my-calendarref="myCalendar"v-model="value"@curMonthDatePrefixChange="curMonthDatePrefixChangeHandler"></my-calendar></div></template><script>importmyCalendarfrom"./myCalendar";importfechafrom"element-ui/src/utils/date";//element-ui中处理时间的工具类exportdefault{name:"Duty",components:{myCalendar,},data(){return{value:newDate(),test:"",};},methods:{curMonthDatePrefixChangeHandler(curMonthDatePrefix){console.log(curMonthDatePrefix);//可在此事件中添加请求信息之类的方法console.log("curMonthDatePrefix",curMonthDatePrefix);console.log("getMondayDay",this.getMondayDay(curMonthDatePrefix));console.log("getSundayDay",this.getSundayDay(curMonthDatePrefix));console.log("getLastSundayDay",this.getLastSundayDay(curMonthDatePrefix));console.log("getLastDayOfMonth",this.getLastDayOfMonth(curMonthDatePrefix));console.log("getFirstDayOfMonth",this.getFirstDayOfMonth(curMonthDatePrefix));},/***@description:获取日历面板上第一个周一*@param{*}Month2022-04*@return{*}第一个周一的日期2022-03-28*/getMondayDay(Month){letnow=newDate(this.getFirstDayOfMonth(Month));letday=now.getDay()||7;returnfecha.format(newDate(now.getFullYear(),now.getMonth(),now.getDate()+1-day),"yyyy-MM-dd");},/***@description:获取某月最后一天后面最近的一个周末*@param{*}Month2022-04*@return{*}某月最后一天后面最近的一个周末2022-05-01*/getSundayDay(Month){letnow=newDate(this.getLastDayOfMonth(Month));letday=now.getDay()||7;returnfecha.format(newDate(now.getFullYear(),now.getMonth(),now.getDate()+7-day),"yyyy-MM-dd");},/***@description:获取日历面板上最后一个周末*@param{*}Month2022-04*@return{*}最后一个周末的日期2022-05-08*/getLastSundayDay(Month){letmonday=newDate(this.getMondayDay(Month));letsunday=monday.setDate(monday.getDate()+41);returnfecha.format(newDate(sunday),"yyyy-MM-dd");},/***@description:获取某月最后一天*@param{*}Month月份2022-04*@return{*}某月最后一天日期2022-04-30*/getLastDayOfMonth(Month){letcurMonth=Month.split("-");letyear=curMonth[0];letmonth=curMonth[1];returnfecha.format(newDate(year,month,0),"yyyy-MM-dd");},/***@description:获取某月第一天*@param{*}Month月份2022-04*@return{*}某月第一天日期2022-04-01*/getFirstDayOfMonth(Month){letcurMonth=Month.split("-");letyear=curMonth[0];letmonth=curMonth[1];returnfecha.format(newDate(year,month-1).setDate(1),"yyyy-MM-dd");},},};</script>

Time!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我打算买个iPhone5 家里有无线网,打电话时间长,打的也多,选移动,电信... iphone 5 用哪家的? 准备下月败个用用,联通、电信、移动,选哪家? 主要... BTC跌破挖矿成本? 真实数据告诉你,挖矿究竟还有没有价值? 东阳轻轨经过哪些站 东阳体育馆轻轨站有几个出口 月饼表面刷的鸡蛋液怎么做 行车记录仪寿命都太短 行车记录仪寿命都太短怎么回事 QQ音乐在哪里查看订单 购买记录查询教程 社会达尔文主义对世界的影响 “98390”代表什么意思? 十七岁今年,来月精二年半,前两个月是一个月来两次月精,这个月一直来... 若二元一次方程组 和 同解,则可通过联立( )和( )解方程组。 小明和小文同解一个二元一次方程组{cx-3y=-2{ax+by=2,小明正确解得{x=... 小明和小刚一同解方程组{ax+by=26,cx+y=6.小明说:“我得到的正确... 小明和小文同解一个二元一次方程组ax+by=16① bx+ay=②,小明把方程①抄... 小红和小明同解一个二元一次方程组ax+by=16①bx+ay=1②。小红把方程①... 什么方法提升花呗额度 遇到一个同年同月同日同一家医院出生的人,怎么办呢? Solaris 10安装和配置SSH Solaris8安装OPENSSH方法 卵泡大于12个是什么意思 卵巢卵泡多是什么原因 LOL英雄联盟的武器大师怎么玩 LOL3150英雄 战争之王好还是武器大师好。我喜欢暴力的啊哈。 英雄联盟 武器大师的技能有什么??分别有什么用???厉害不???_百度知... 柴鸡蛋起名 ...win7的搜索不到网络,插上网线也不行 无线路由也没用 求高人帮忙_百 ... win7无线网络无法连接。信号是满的,已经启动的,并且把无线的适配器更新... 无线网卡驱动升级后无法搜索到网络 我用的是惠普CQ40-520TX,由vista升级到win7之后,无线网卡不能用,驱动更... 滴水湖地铁站到友谊路1号怎么坐车 ...现在我们不做同位了,他还是跟以前一样,主动来找我玩。(我是女的... 烦死我同位了,是个男的,一开始不是跟他一个同位,可他跟他同位光说话... 我和一男的以前做同位,他学习很好,平时对我超好,无微不至的照顾,对别人... ...一个男生和我同位后就在也不理我了,在此之前我们有两个月没说话了... 有两位男生说 我同位(男的)在我背后说了很多坏话,我那次听了立马说... 我男朋友和以前的同位聊天,那个女的问他在干嘛,他说你干嘛,多少钱一夜... 学人力资源管理的学生需要考ms office 计算机二级吗,还是Access二级?哪... 咒怨里的女鬼为什么要杀死骏雄?? 苏州万盛街招商银行什么时候开门 从青剑湖d区坐几路车能到招商银行营业厅 苏州招商银行可以提取瑞士法郎现金吗? 多卵泡是什么原因造成的呢 卵泡多怎么办 初中毕业后不想去工厂,怎么办? 小卵泡多是什么意思 初中毕业不想上学,不想打工,干什么合适? 双侧卵巢内小卵泡较多是什么引起的 鲁能泰山7号是什么意思 ...Pro(Retina屏)15.4英寸如何?具体评测可以发一下 我在苏州高新区,想知道苏州招商银行今天营业吗?我想办理招商银行卡