uniapp日历插件

article/2025/8/25 7:21:03

日历插件

  • 效果图
  • 一、使用方法
  • 二、组件编写,两个文件、直接上代码
    • month.vue
    • calendar.vue


效果图

请添加图片描述

一、使用方法

<template><view><view class="" @click="open"><text>展示日历{{value[0]}}-{{value[1]}}</text></view><calendar v-if="show" @change="change" @close="close" :show.sync="show" v-model="value" :option="dateOption"></calendar></view>
</template><script>export default {data() {return {dateOption: {formatter:'yyyy/mm/dd',//默认为时间戳minDate:'2023/01/05', //默认为当前日期往前6个月maxDate: '2023/11/11',//默认为当前日期往后6个月dateNum: 2, //选择的日期个数,可选值1,2, 默认为2minRange: 0, //两个日期的间隔天数,默认为0startText: '开始', //第一个日期的文字显示,默认‘开始’endText: '结束',//第一个日期的文字显示,默认‘结束’},value: [],show: false,}},methods: {open(){this.show = true;},// value值发生变更,可选change(){},// 关闭日历事件触发,可选close(){}}}
</script>

二、组件编写,两个文件、直接上代码

month.vue

<template><view class="month-box"><view class="box-title"><text class="titletext">{{year}}{{month}}</text></view><view class="month"><view class="item" v-for="item in days"><view @click="selectDay(item)":class="{'item-con': true, 'itemno': !item.isSelect, 'item-sel': (item.timeNo==value[0] || item.timeNo==value[1]),  'item-jian': (item.timeNo>value[0] && item.timeNo<value[1])}"v-if="item"><text class="text">{{item.date}}</text><text class="kai" v-if="item.timeNo==value[0]">{{startText}}</text><text class="jie" v-if="item.timeNo==value[1]">{{endText}}</text></view></view></view></view>
</template><script>export default {props: {year: {type: String | Number,default: '2023'},startText: {type: String,default: '开始'},endText: {type: String,default: '结束'},month: {type: String | Number,default: '4'},maxDate: {type: Boolean | Number,default: false},minDate: {type: Boolean | Number,default: false},value: {type: Array,default: () => {return []}}},data() {return {day: 24 * 3600 * 1000,max: 0,min: new Date(this.year + '/' + this.month).getTime(),}},methods: {selectDay(day) {if(day.isSelect){this.$emit('change', day.timeNo)}},},computed: {days() {let dataArr = [];if(new Date(this.min).getDay() == 0){dataArr[5] = undefined;} else if(new Date(this.min).getDay()>=2){dataArr[new Date(this.min).getDay()-2] = undefined;}if (this.month == 12) {this.max = new Date((this.year - 0 + 1) + '/1').getTime()} else {this.max = new Date(this.year + '/' + (this.month - 0 + 1)).getTime()}let i = 0;let isSelect = true;while (this.min + i * this.day < this.max) {if (this.maxDate && this.min + i * this.day > this.maxDate) {dataArr.push({date: i + 1,isSelect: false,timeNo: this.min + i * this.day})} else if (this.minDate && this.min + i * this.day < this.minDate) {dataArr.push({date: i + 1,isSelect: false,timeNo: this.min + i * this.day})} else {dataArr.push({date: i + 1,isSelect: true,timeNo: this.min + i * this.day})}i++}return dataArr;}}}
</script><style scoped lang="less">.box-title {display: flex;align-items: center;justify-content: center;.titletext {color: #000;padding-top: 30rpx;font-size: 32rpx;font-weight: bold;padding-bottom: 20rpx;}}.month {padding: 0 25rpx;display: flex;flex-flow: row;flex-wrap: wrap;.item {width: 100rpx;height: 100rpx;.item-con {width: 100rpx;height: 100rpx;color: #333;display: flex;flex-flow: column;justify-content: center;align-items: center;&.itemno {color: #999;}&.item-sel {background-color: rgb(60, 156, 255);.text {color: white;}.kai {font-size: 20rpx;line-height: 1;color: white;}.jie {font-size: 20rpx;line-height: 1;color: white;}}&.item-jian {background-color: rgb(236, 245, 255);.text {color: rgb(60, 156, 255);}}}}}
</style>

calendar.vue

<template><view class="calendar" v-if="show"><view class="bg" @click="close"></view><view class="con"><view class="con-top"><view class="con-title"><view class="con-clear" @click="clear"><text class="textclear">清除</text></view><view class="title"><text class="texttitle">日期选择</text></view><view class="con-cancle" @click="close"><text class="cancle">关闭</text></view></view><view class="date"><text v-for="i in zhou">{{i}}</text></view></view><view class="con-center"><scroll-view class="scroll" scroll-y="true" :scroll-into-view="toview" scroll-top="120"><month @change="change" :startText="option.startText" :endText="option.endText" :id="'a'+item.year+item.month" v-for="item in monthArr":maxDate="option.maxDate" :minDate="option.minDate" :value="selectValue" :month="item.month":year="item.year"></month></scroll-view></view><view class="con-button" @click="sureDate" :class="{on: isClick}"><text class="sure">确定</text></view></view></view>
</template><script>import month from "./month.vue"export default {props: {show: {type: Boolean,default: false},option: {type: Object,default: {}},value: {type: Array,default: []}},components: {month},computed: {isClick(){return (this.selectValue.length == this.option.dateNum) || this.selectValue.length == 2}},data() {let value = [];if (this.value) {if (this.value[0]) {value[0] = new Date(new Date(this.value[0]).toDateString()).getTime();}if (this.value[1]) {value[1] = new Date(new Date(this.value[1]).toDateString()).getTime()}}return {toview: '',zhou: ['一', '二', '三', '四', '五', '六', '日'],monthArr: [],selectValue: value,isShow: false}},mounted() {this.option.maxDate = new Date(this.option.maxDate).getTime() || new Date().getTime() + 183 * 24 * 3600 * 1000this.option.minDate = new Date(this.option.minDate).getTime() || new Date().getTime() - 183 * 24 * 3600 * 1000let maxYear = new Date(this.option.maxDate).getFullYear();let maxMonth = new Date(this.option.maxDate).getMonth() + 1;let minYear = new Date(this.option.minDate).getFullYear();let minMonth = new Date(this.option.minDate).getMonth()+1;let i = 0;let monthArr = [];while (new Date(new Date(minYear + '/' + minMonth).setMonth(minMonth - 1 + i)).getTime() <= new Date(maxYear +'/' + maxMonth).getTime()) {monthArr.push({year: new Date(new Date(minYear + '/' + minMonth).setMonth(minMonth - 1 + i)).getFullYear(),month: new Date(new Date(minYear + '/' + minMonth).setMonth(minMonth - 1 + i)).getMonth() + 1});i++;}this.monthArr = monthArr;let toview = '';if (this.selectValue[0]) {toview = 'a' + new Date(this.selectValue[0]).getFullYear() + (new Date(this.selectValue[0]).getMonth() + 1)}this.$nextTick(() => {this.toview = toview})},methods: {formatter(date, formatter){let year = new Date(date).getFullYear()let month = new Date(date).getMonth()+1let day = new Date(date).getDate()return formatter.replace(/yyyy/i, year).replace(/mm/i, month).replace(/dd/i, day)},sureDate(){if(!this.isClick) returnlet value = [];if(this.option.formatter){value = [this.formatter(this.selectValue[0], this.option.formatter)]if(this.selectValue[1]){value.push(this.formatter(this.selectValue[1], this.option.formatter))}}this.$emit('input', value)this.$emit('update:show', false)this.$emit('change')this.$emit('close')},close(){this.$emit('update:show', false)this.$emit('close')},clear(){this.$emit('input', [])this.$emit('update:show', false)this.$emit('change', [])this.$emit('close')},change(day) {if(this.option.dateNum && this.option.dateNum == 1){this.selectValue = [day];return;}if (!this.selectValue.length) {this.selectValue = [day];} else if (this.selectValue.length == 1) {if (this.selectValue[0] > day) {this.selectValue = [day]} else {if (this.option.minRange) {if (this.option.minRange * 3600 * 24 * 1000 + this.selectValue[0] > day) {uni.showToast({icon: 'none',title: `选择间隔时间必须大于${this.option.minRange}`})} else {this.selectValue = [this.selectValue[0], day];}} else {this.selectValue = [this.selectValue[0], day];}}} else {this.selectValue = [day]}}}}
</script><style scoped lang="less">.calendar {position: fixed;bottom: 0;left: 0;right: 0;top: 0;height: 100vh;.bg {width: 750rpx;height: 100vh;background: rgba(0, 0, 0, 0.5);}.con {position: absolute;left: 0;bottom: 0;right: 0;background: #fff;padding-top: 20rpx;.con-title {display: flex;height: 80rpx;flex-flow: row;justify-content: space-between;align-items: center;padding: 0 40rpx;padding-bottom: 20rpx;}.date {display: flex;flex-flow: row;height: 60rpx;justify-content: space-between;align-items: center;padding: 0 40rpx;border-bottom: 2rpx solid #eee;}.con-center {height: 800rpx;padding: 20rpx 0;.scroll {height: 800rpx;.item {height: 500rpx;}}}.con-button{height: 80rpx;width: 650rpx;display: flex;align-items: center;justify-content: center;margin: 20rpx 50rpx;background-color: rgb(60, 156, 255);border-radius: 40rpx;opacity: .5;&.on{opacity: 1;}.sure{font-size: 40rpx;color: #fff;}}}}
</style>

http://chatgpt.dhexx.cn/article/4xVrHSPq.shtml

相关文章

calendar.js多种形式日历插件

下载地址 calendar.js是一款强大的日历插件&#xff0c;有多种形式的日历插件&#xff0c;比如&#xff0c;选择年、选择月、范围等。 dd:

日历插件:bootstrap-datetimepicker

1. 简述 前端插件使用步骤&#xff1a; 1)引入开发包&#xff1a;.js,.css 下载开发包&#xff0c;拷贝到项目webapp目录下 把开发包引入到jsp文件中&#xff1a;<link><script> 2)创建容器&#xff1a;<input type"text"…

最棒的 10 款 jQuery 日历插件

RT&#xff0c; 最棒的 10 款 jQuery 日历插件 做个记号&#xff0c;以后就不用再翻来翻去 1、JavaScript Calendar, JSCal2 地址&#xff1a;点击打开链接 2、Date Picker 地址&#xff1a;点击打开链接 3、 jQuery Frontier Calendar 地址&#xff1a;点击打开链接…

vue日历插件vue-calendar

原始效果&#xff1a; 修改后的效果&#xff1a; 接下来&#xff0c;我们使用它&#xff5e; 1.安装 npm i vue-calendar-component --save cnpm i vue-calendar-component --save //国内镜像 2.在使用到日历插件的文件中引入 import Calendar from vue-calendar-componen…

使用JS实现简单的日历插件

实现简单的日历插件 一、简要介绍二、基础代码html部分js部分 一、简要介绍 实现一个如下图所示的日历&#xff0c;这边主要提供html部分和js部分的代码&#xff0c;css部分大家自行编写哦。 二、基础代码 html部分 其实就是一个div容器&#xff0c;为其设置相应的id值。 <…

FullCalendar - 开源的多功能 JavaScript 日历插件

本文字数&#xff1a;747 字 9图 阅读完需&#xff1a;约 4 分钟 点击上方“青年码农”关注 回复“源码”可获取各种资料 FullCalendar 是一个支持 React、Vue、Angular 和原生 JavaScript 的日历插件&#xff0c;FullCalendar 拥有超过 300 种设置&#xff0c;支持模块化导入&…

HTML页面日历插件

web页面显示日历插件。如下图 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>body,td,.p1,.p2,.i {font-family: arial}body {margin: 6px 0 0 0;background-color: #fff;color: #000;}tab…

js日历插件

日历插件&#xff1a;bootstraprap-datetimepicker 前端插件使用步骤&#xff1a; 1.引入开发包&#xff1a; js css 文件 下载开发包&#xff0c;拷贝到项目webapp目录下 把开发包引入到jsp文件中&#xff1a; <link rel"stylesheet" type"text/css&qu…

超好用的js 日历插件 日期插件 日期日历选择控件

前情提要&#xff1a; 主要是目前项目较小&#xff0c;仅需要一个日历插件&#xff0c;就没有选择引用UI框架&#xff0c;单纯找了一个日历插件&#xff0c;外观相对简单大方&#xff0c;还不错&#xff0c;而且只需要2步就可以完成引入&#xff1a; 第一步&#xff08;有2种方…

微信小程序日历插件用法-举例为(爸妈搜日历)

一、添加插件 在小程序管理后台添加插件。 小程序管理后台地址&#xff1a;https://mp.weixin.qq.com/ 设置>第三方设置>插件管理 添加插件&#xff0c;可以直接搜索名称(爸妈搜日历)或者AppID(wx23a9cef3522e4f7c) 二、在小程序app.json文件中引入插件声明 "plugi…

前端ui组件(1):日程排班—11个优秀JavaScript 日历插件

日历是我们生活中重要的一部分。在当今世界,人们大多使用网络或移动日历。它们随处可见,包括在各种软件中:预订应用、旅行软件、项目管理、管理面板等。 出于多种原因,用户可能需要在网站上使用日历。用户需要容果从日历中选择日期来填写表格,或者在填写某些信息时提供日…

好用的日历插件(三款常用的日历插件)

1、laydate https://www.layui.com/laydate/ 全面重写的 layDate 包含了大量的更新&#xff0c;其中主要以&#xff1a;年选择器、年月选择器、日期选择器、时间选择器、日期时间选择器 五种类型的选择方式为基本核心&#xff0c;并且均支持范围选择&#xff08;即双控件&…

【典例】链表经典题目合集

目录导航 1. 删除链表中给定值为val的所有节点2. 反转一个单链表3. 返回链表中间节点&返回链表倒数第k个节点4. 链表的回文结构5. 合并两个有序链表6. 输入两个链表&#xff0c;找出它们第一个公共节点7. 分割链表8. 判断链表是否带环&找环的入口点9. 复制复杂链表10. …

链表知识点总结

目录 一、基本概念&#xff1a; 1.定义&#xff1a; 2.性质&#xff1a; 3.链表的分类&#xff1a; 单链表&#xff1a; 双向链表 单链表和双向链表的区别&#xff1a; 双向链表的作用&#xff1a; 循环链表 二、链表的主要操作&#xff1a; 1.插入操作&#xff1a; a.重…

二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技

二级指针实现单链表的插入、删除 今天看了coolshell上关于二级指针删除单链表节点的文章。 文章中Linus 举例&#xff1a; 例如&#xff0c;我见过很多人在删除一个单项链表的时候&#xff0c;维护了一个”prev”表项指针&#xff0c;然后删除当前表项&#xff0c;就像这样…

C++实现链表

C实现链表 众所周知&#xff0c;C/C语言实现的链表是由一个一个的结点构成&#xff0c;每个结点分为数据域和指针域&#xff0c;指针域中存储了其后继结点的地址&#xff0c;通过地址来访问下一个结点。 链表是一系列节点串联形成的数据结构&#xff0c;链表存储有序的元素集合…

2130. 链表最大孪生和

地址&#xff1a; 力扣https://leetcode-cn.com/problems/maximum-twin-sum-of-a-linked-list/ 题目&#xff1a; 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪…

链表基础【C++实现】

平台&#xff1a;Visual Studio 2022 编程工具&#xff1a;C 目录&#xff1a; 1、链表的结构体实现 2、链表的声明、开辟空间 3、链表的初始化 4、链表的连接 5、链表输出 6、完整代码实例 1、链表的结构体实现 链表由一系列结点&#xff08;链表中每一个元素称为结点&#…

体能修复6-编程-剑指offer-JZ22 链表中倒数最后k个结点

描述 输入一个长度为的链表&#xff0c;设链表中的元素的值为&#xff0c;返回该链表中倒数第个节点。 如果该链表长度小于&#xff0c;请返回一个长度为的链表。 数据范围:&#xff0c;&#xff0c; 要求&#xff1a;空间复杂度&#xff0c;时间复杂度 进阶&#xff1a;空…

Niuke:JZ36.二叉树与双向链表

文章目录 &#xff2e;iuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现 &#xff2e;iuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;…