Vue的日历显示获取

1 篇文章 0 订阅

分享Vue的日历显示获取,以及组件之间的通讯

这里我们用到了两个JS的插件
①Vue的引入
②日历农历的JS引入

 	<script src="./Vue.js"></script>
    <script src="./nong.js"></script>

通常我们正常的思路为画页面
CSS部分

.box {
        width: 350px;
        margin: 50px auto;
        text-align: center;
        position: relative;
    }

    .picker {
        width: 100%;

    }

    .picker_bottom {
        width: 100%;
        position: absolute;
        left: 0;
        top: 50px;
    }

    .picker_header {
        width: 100%;
        height: 40px;
        line-height: 40px;
        background-color: black;
        color: goldenrod;
        display: flex;
    }

    .dateshow {
        flex: 6;
    }

    .prev,
    .next {
        flex: 2;
        cursor: pointer;
    }

    .item {
        width: 50px;
        height: 50px;
        float: left;
        background-color: black;
        color: goldenrod;
        line-height: 20px;
        cursor: pointer;
        font-size: 12px;
    }

    .item:hover {
        box-sizing: border-box;
        border: 1px dashed greenyellow;
    }

页面以及子组件的控件部分

 	<div class="box">
        <mydatepicker @getdays="getDays"></mydatepicker>
    </div>

这里我们用Vue的驱动将子组件的Dom生成到mydatepicker 中

<template id="datepicker">
    <div class="picker">
        <div class="picker_title">
            开始时间 <input @click.stop="showPicker" v-model="inputDays">
            <button @click="getcurrentinp">获取当前的时间</button>
        </div>
        <div class="picker_bottom" v-show="flag">
            <div class="picker_header">
             <!-- 这里的stop用于阻止冒泡的事件 -->
                <div class="prev" @click.stop="prevmouth"></div>
                <div class="dateshow">{{timeshow}}</div>
                <div class="next" @click.stop="nextmouth"></div>
            </div>
            <div class="picker_content">
                <!-- 上个月显示的天数 -->
                <div class="item" style="color:brown" v-for="i in prevList" @click="getYMD(-1,i)">
                    {{i}} <br>
                    <span>{{getlongli(i,-1)}}</span>
                </div>
                <!-- 这个月显示的天数 -->
                <div class="item" v-for="j in thismouthday" @click="getYMD(0,j)">
                    {{j}}<br>
                    <span>{{getlongli(j,0)}}</span>
                </div>
                <!-- 下个月显示的天数 -->
                <div class="item" style="color:gray" v-for="k in nextdays" @click="getYMD(1,k)">
                    {{k}}<br>
                    <span>{{getlongli(k,1)}}</span>
                </div>
            </div>
        </div>

    </div>
</template>

js部分

  //获取当前月有多少天,不要用箭头函数不然会指向windows
  //Date.prototype运用了原型继承的思想,自己找不到找原型对象
    Date.prototype.getCurrentMouthDays = function () {
        let tempDate = new Date("2000-01-01");
        tempDate.setFullYear(this.getFullYear());   
        tempDate.setMonth(this.getMonth() + 1);     //这里可能对于初学者来说有点绕,我简要的描述一下,正常的月份是1-12月,但是计算机并不是这么识别而是通过getMonth()下标的寻找来进行输出,如果我们用于当前月则按照正常的写法就好,但是如果展示给用户则需要加1
        tempDate.setDate(0);

        return tempDate.getDate();
    }

    //上个月有多少天
    Date.prototype.prevMouthDays = function () {
        let tempDate = new Date("2000-01-01");
        tempDate.setFullYear(this.getFullYear());
        tempDate.setMonth(this.getMonth());
        tempDate.setDate(0);

        return tempDate.getDate();
    }

    //获取当前时间的第一天是星期几
    Date.prototype.nextMouthDays = function () {
        let tempDate = new Date("2000-01-01");
        tempDate.setFullYear(this.getFullYear());
        tempDate.setMonth(this.getMonth());

        return tempDate.getDay(); //11月返回的是0,0代表周日
    }

    //时间的格式化
    Date.prototype.FormatDate = function (str) {
        var year = this.getFullYear();
        var mouth = this.getMonth() + 1;   //展示月份得加一
        var day = this.getDate();
        return str.replace("yyyy", year).replace("mm", mouth).replace("dd", day);
    }

    // 时间函数的封装测试
    // var data = new Date();
    // console.log(data.FormatDate("mmmm-yy-dd"));



    new Vue({
        el: ".box",
        data: {

        },
        methods: {
            getDays(item) {
                alert(item);
            }
        },

        components: {
            "mydatepicker": {
                template: "#datepicker",
                data() {
                    return {
                        flag: false,
                        date: new Date(),
                        prevList: [],
                        inputDays: "",
                    }
                },
                methods: {
                    //获取农历
                    getlongli(day, n) {
                        var year = this.date.getFullYear();
                        var mouth = this.date.getMonth() + 1 + n;
                        //GetLunarDay这里调用的函数则是调用js里面的方法
                        var str = GetLunarDay(year, mouth, day).split(" ")[1].substring(2, 4);
                        return str
                    }
                    ,
                    //组件通讯
                    getcurrentinp() {
                        this.$emit("getdays", this.inputDays)
                    },
                    getYMD(n, day) {
                        // 因为我用了上个月.这个月,下个月三个盒子来解决需求,这里的n就尤为的重要
                        var year = this.date.getFullYear();
                        var mouth = this.date.getMonth() + n;


                        var date = new Date("2000-01-01");
                        date.setFullYear(year);
                        date.setMonth(mouth);
                        date.setDate(day);

                        //设置时间
                        this.inputDays = date.FormatDate("yyyy-mm-dd");
                    },
                    showPicker() {
                        this.flag = true;
                    },
                    prevmouth() {
                        //减
                        this.date.setMonth(this.date.getMonth() - 1);
                        this.subeverydays();
                    },
                    nextmouth() {
                        //加
                        this.date.setMonth(this.date.getMonth() + 1);
                        this.subeverydays();
                    },
                    subeverydays() {
                        //这个月的天数
                        this.thismouthday = this.date.getCurrentMouthDays();

                        //这个月的时间渲染
                        this.timeshow = this.date.FormatDate("yyyy-mm");

                        //为下面计算上个月的格子有多少个
                        this.showDays = this.date.nextMouthDays() == 0 ? 7 : this.date.nextMouthDays();
                        this.prevList = [];
                        for (var i = this.date.prevMouthDays() - this.showDays + 2; i <= this.date.prevMouthDays(); i++) {
                            this.prevList.push(i);
                        }

                        //下一个月的天数  42个格子-当前天的格子
                        this.nextdays = 42 - this.date.getCurrentMouthDays() - this.showDays + 1;
                    }
                },
                created() {
                    //钩子函数,在渲染之前来访问数据并赋值
                    this.subeverydays();
                },
                mounted() {
                    //钩子函数,当页面加载完成后的生命周期,这里必须用箭头函数,因为箭头函数的指向上下文的关系,那么这里的this指向的是mounted
                    document.onclick = () => {
                        this.flag = false;
                    }
                }
            },
        }
    });
</script>
### 回答1: Vue 日历可以通过自定义组件的方式来实现法定休班的显示。首先需要定义一个数据数组,用来存储法定休班的日期。可以通过接口获取这些日期数据,也可以通过手动输入的方式来添加。 然后在日历的模板中,通过 v-for 循环遍历每一个日期,判断当前日期是否为法定休班,如果是则添加相应的样式来标识出来。 在实现上述功能的同时,还可以添加一些更加丰富的功能,如可点击的日期、月份切换等,以及一些扩展的功能,如节假日提醒、调班调休等。 总的来说,Vue 日历的实现不仅可以提高用户的使用体验,在企业应用中也可以方便地实现法定休班等相关功能,从而提高工作效率和员工满意度。 ### 回答2: Vue日历显示法定休班可以使用两种方法:使用第三方组件或自定义组件。 使用第三方组件可以节省编写代码的时间,可以使用开源的组件如vue-calendar和vue-full-calendar等。这些组件可以通过npm包管理器安装和引入到Vue项目中。在组件中可以配置日期和节假日,同时可以使用自定义样式来自定义显示效果。大多数组件可以支持多种语言和不同的时区,具有较好的兼容性。 自定义组件则需要根据自己的需求设计和编写,可以使用Vue提供的API和插件来处理日期和节假日。可以在template中创建表格或日历,使用computed属性来计算日期和节假日的状态,结合样式来完成日历显示法定休班的效果。自定义组件的优点是可以支持更多的功能,如国际化、自定义样式等。 总之,Vue日历显示法定休班需要根据项目需求和开发者编程能力来决定使用第三方组件还是自定义组件。无论哪种方式,都需要注意兼容性、效率和可维护性等方面的问题。 ### 回答3: Vue日历可以很方便地实现法定休假和班级的显示。在日历组件中,我们可以定义一个列表,将法定休假和班级一一绑定,然后在渲染日历时按照日期匹配法定假期和班级。 首先,我们需要定义一个数组来存储所有法定假期和班级,直接在data中定义即可。哪些日期是法定节假日和调休日,可以通过调用第三方的API获取,也可以在页面中手动定义。定义完后,我们将每个日期作为键,将其属性设置为对应的班级或假期。 接着,我们可以在日历组件中定义一个方法,用来渲染每个日期的样式和文本。在该方法中,我们可以首先获取当前日期,并检查其是否为法定假期或调休日。如果是,则渲染假期的样式和文本,否则,则通过查找当前日期对应的班级,来渲染班级名称和对应的样式。 在使用Vue日历显示法定休班的过程中,还需要注意一些问题。例如:如果某个法定假期与班级的安排冲突,该怎么处理?我们需要在设计数据结构时,先判断出哪些日期是有争议的,然后通过向用户弹出提示框等方式让用户选择如何处理。 总之,Vue日历可以很方便地显示法定休班。通过合理的设计数据结构和页面渲染逻辑,我们可以创建一个易用而又功能强大的日历组件。当然,针对具体应用场景的情况,还需要根据需要进行调整和优化,从而更好地满足用户需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值