uniApp封装日期选择器(自动对齐星期)

这篇具有很好参考价值的文章主要介绍了uniApp封装日期选择器(自动对齐星期)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 先看实现效果

显示当前选中日期的一周

uniapp日期选择器,vue,javascript,微信小程序,html5,Powered by 金山文档

展开显示当月

uniapp日期选择器,vue,javascript,微信小程序,html5,Powered by 金山文档

左右滑动可以切换上下周,顶部切换年月

uniapp日期选择器,vue,javascript,微信小程序,html5,Powered by 金山文档
  • 组件功能:

在小程序/APP中,部分页面需要用户切换日期来实现数据请求,该组件可实现切换年月日,日期与星期匹配,返回一个YYYY-MM-DD的数据,这里我组装成了{year:YYYY, month:MM, day:DD}的格式。

  • 上代码

子组件:CustomCalendar.vue

图标使用的是uview的u-icon,你们可以自己替换想要的png都行


<template>
    <view class="custom-calendar">
        <view class="title">
            <u-icon name="arrow-left" color="#8F9BB3" size="32rpx" class="left" @click="lastMonth"></u-icon>
            {{year}}年{{month<10?'0'+month:month}}月
            <u-icon name="arrow-right" color="#8F9BB3" size="32rpx" class="right" @click="nextMonth"></u-icon>
        </view>
        <view class="week">
            <view class="week-item" v-for="(item,index) in weekArr" :key="index">
                {{item}}
            </view>
        </view>
        <template v-if="!showAll">
            <swiper class="swiper" :current="swiperCurrent">
                <swiper-item v-for="item in daysArr" :key="item.id">
                    <view class="day-wrap">
                        <view :class="['day-item',{'active':current === i.value}]" v-for="i in item.arr" :key="i.id"
                            @click="selectDate(i.value)">
                            <text class="day">{{i.value}}</text>
                        </view>
                    </view>
                </swiper-item>
            </swiper>
        </template>
        <template v-else>
            <view class="day-wrap" v-for="item in daysArr" :key="item.id">
                <view :class="['day-item',{'active':current === i.value}]" v-for="i in item.arr" :key="i.id"
                    @click="selectDate(i.value)">
                    <text class="day">{{i.value}}</text>
                </view>
            </view>
        </template>
        <view class="more">
            <u-icon :name="!showAll?'arrow-down':'arrow-up'" size="40" @click="switchShowMode" color="#8F9BB3"></u-icon>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                // false展示一行  true展示所有 
                showAll: false,
                // 年
                year: "",
                // 月
                month: "",
                // 日
                day: "",
                swiperCurrent: 0,
                // 星期几
                weekday: 1,
                // 每天
                daysArr: [],
                // 当前选中
                current: 1,
                weekArr: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
            }
        },
        created() {
            this.init();
        },
        methods: {
            // 选择日期
            selectDate(val) {
                if (!val) return;
                this.current = val;
                //这里我组装成了{year:YYYY,  month:MM,  day:DD}的格式
                //你们可以自己返回想要的数据格式
                this.$emit('current',{
                    year:this.year,
                    month:this.month,
                    day:this.current,
                })
            },
            // 切换显示模式
            switchShowMode() {
                this.showAll = !this.showAll;
                this.getSwiperCurrent();
            },
            // 获取当前Swiper Current
            getSwiperCurrent() {
                this.swiperCurrent = this.daysArr.findIndex((item) => {
                    return item.arr.some(i => i.value === this.current);
                });
            },
            // 初始化
            init() {
                let now = new Date();
                this.year = now.getFullYear();
                this.month = now.getMonth() + 1;
                this.day = now.getDate();
                this.current = this.day;
                //这里我组装成了{year:YYYY,  month:MM,  day:DD}的格式
                //你们可以自己返回想要的数据格式
                this.$emit('current',{
                    year:this.year,
                    month:this.month,
                    day:this.current,
                })
                this.changeData();
                this.getSwiperCurrent();
            },
            // 获取当前星期几
            getWeekday(year, month) {
                let date = new Date(`${year}/${month}/01 00:00:00`);
                return date.getDay() === 0 ? 7 : date.getDay();
            },
            //一个月有多少天
            getMonthDay(year, month) {
                let days = new Date(year, month, 0).getDate();
                return days;
            },
            // 切换日期 该函数逻辑完善不建议改动 但可精简优化
            changeData() {
                this.day = this.getMonthDay(this.year, this.month);
                this.weekday = this.getWeekday(this.year, this.month);
                let daysArr = this.generateArray(1, this.day)
                for (let i = 0; i < this.weekday - 1; i++) {
                    daysArr.unshift("")
                }
                let arr = [];
                daysArr.map((item, index) => {
                    if (index !== 0 && index % 7 === 0) {
                        if (index === daysArr.length - 1) {
                            this.daysArr.push({
                                id: this.$u.guid(),
                                arr
                            });
                            arr = [];
                            arr.push({
                                id: this.$u.guid(),
                                value: item
                            });
                            this.daysArr.push({
                                id: this.$u.guid(),
                                arr
                            });
                            if (arr.length !== 7) {
                                const len = arr.length
                                for (let i = 0; i < 7 - len; i++) {
                                    arr.push("")
                                }
                            }
                        } else {
                            this.daysArr.push({
                                id: this.$u.guid(),
                                arr
                            });
                            arr = [];
                            arr.push({
                                id: this.$u.guid(),
                                value: item
                            });
                        }
                    } else if (index === daysArr.length - 1) {
                        arr.push({
                            id: this.$u.guid(),
                            value: item
                        });
                        if (arr.length !== 7) {
                            const len = arr.length
                            for (let i = 0; i < 7 - len; i++) {
                                arr.push("")
                            }
                        }
                        this.daysArr.push({
                            id: this.$u.guid(),
                            arr
                        });
                    } else {
                        arr.push({
                            id: this.$u.guid(),
                            value: item
                        });
                    }
                });
                this.daysArr = this.daysArr
            },
            generateArray: function(start, end) {
                return Array.from(new Array(end + 1).keys()).slice(start);
            },
            // 上一月
            lastMonth(){
                if (this.month==1) {
                    this.month = 12
                    this.year = this.year-1
                }else{
                    this.month = this.month-1
                }
                this.day = 1
                this.daysArr = []
                this.changeData()
                this.showAll = true
            },
            //下一月
            nextMonth(){
                if (this.month==12) {
                    this.month = 1
                    this.year = this.year+1
                }else{
                    this.month = this.month+1
                }
                this.day = 1
                this.daysArr = []
                this.changeData()
                this.showAll = true
            }
        }
    }
</script>

<style scoped lang="scss">
    .custom-calendar {
        background-color: #FFFFFF;
        position: sticky;
        top: 0;
        /*  #ifdef  H5  */
        top: 44px;
        /*  #endif  */
        z-index: 99;
        padding: 0 20rpx;

        .title {
            padding: 20rpx 32rpx;
            text-align: center;
            font-weight: bold;
            .left{
                padding: 10rpx;
                margin-right: 30rpx;
                background-color: #E4F0FC;
                border-radius: 8rpx;
            }
            .right{
                padding: 10rpx;
                margin-left: 30rpx;
                background-color: #E4F0FC;
                border-radius: 8rpx;
            }
        }
        .week {
            display: flex;
            align-items: center;
            text-align: center;
            .week-item {
                flex: 1;
            }
        }
        .day-wrap {
            display: flex;
            .day-item {
                display: flex;
                justify-content: center;
                flex: 1;
                padding: 10rpx 0;
                flex-direction: column;
                text-align: center;
                border-radius: 8rpx;
                .day {
                    font-weight: bold;
                }
                .num {
                    font-size: 24rpx;
                    color: #8F9BB3;
                    transform: scale(.8);
                }
                &.active {
                    background-color: #0676ED;
                    color: #FFFFFF;
                    .num {
                        color: #FFFFFF;
                    }
                }
            }
        }
        .swiper {
            height: 60rpx !important;
        }
        .more {
            text-align: center;
        }
    }
</style>

父组件:文章来源地址https://www.toymoban.com/news/detail-531138.html


// 在父组件合适的位置引入即可
<template>
    <view class="header">
        <CustomCalendar @current="getday"></CustomCalendar>
    </view>
</template>

<script>
    import CustomCalendar from './components/CustomCalendar.vue'
    export default {
        methods: {
            //获取子组件的天
            getday(item){
                console.log(item,"获取到的日期数据");
                // 格式为:{year:YYYY,  month:MM,  day:DD}
            }
        }
    }
</script>

到了这里,关于uniApp封装日期选择器(自动对齐星期)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包