基于quasar,只选择年度与月份的组件
为什么要做
quasar是个基于vue的强大的UI开发库,它提供了非常多的组件,比如日期选择。但是有些时候只需要选择到月份就可以了,quasar中没有,所以自己动手写了一个。因为对界面编程我不熟悉,所以,如果你有更好的想法,请不吝赐教。源码在gitcode、gitee、github的至简网格/企业服务上都有,以Apache License协议开源,gitcode连接如下:
assets/file/v3/components/month_input.js · master · 至简网格 / 企业服务 · GitCode
用法:
1)先引入
import MonthInput from "path_to_components/month_input.js"
2)再注册
组件中注册:components:{"month-input":MonthInput}
或全局注册:app.component('month-input', MonthInput); app是使用Vue.createApp创建的。
3)最后使用
<month-input class="justify-center text-primary" min="-5" max="cur" @update:modelValue="f"></month-input>
属性
min、max、monthName(默认为“月”)
min、max接受以下几种格式:cur当前月份、-x当前年度减x年,+x当前年度加x年,yyyy/MM、yyyy-MM或yyyy.MM具体的月份;不设置则不限制。
update:modelValue触发回调时传递一个对象,其中包括{year:年份,month:月份(从1开始),num:年份*12+月份-1}
操作
没有点击时显示如下:
![]()
点击左右箭头前移一个月或后移一个月;点击中间的年/月,显示一个弹窗,在min、max指定范围之外的年月显示为灰色,如果选中的年份不在当前年份列表页中,月份全部显示灰色。点击左右箭头前移或后移12年。先选择年份,然后选择月份就可以了触发update:modelValue,同时隐藏弹窗。

源码
//月份选择组件month-input
export default{
data(){return {maxMonth:0,minMonth:0,year:'',month:'',num:0,//year*12+month-1startYear:0,years:[],months:[],old:{y:0,m:0}
}},
props: {modelValue:{type:String},min:{type:String,default:''}, //年份max:{type:String,default:''},monthName:{type:String, default:"月"}
},
emits: ['update:modelValue'],
created(){var m=this.parse(this.max,{y:9999,m:1});this.maxMonth=m.y*12+m.m-1;m=this.parse(this.min,{y:0,m:1});this.minMonth=m.y*12+m.m-1;var dt=new Date();m=this.parse(this.modelValue,{y:dt.getFullYear(),m:dt.getMonth()+1})this.old={year:m.y, month:m.m};this.year=m.y;this.month=m.m;this.num=this.year*12+this.month-1;this.startYear=this.year-4;this.set_array();
},
methods:{
set_array() {var month;var list=[];var chked=false;var v=this.startYear;var yMax=Math.floor(this.maxMonth/12);var yMin=Math.floor(this.minMonth/12);for(var i=0;i<4;i++) {var yy=[];for(var j=0;j<3;j++) {var y={v:v,cls:"col text-center"};if(v>yMax||v<yMin) {y.cls+=" text-grey";} else if(v==this.year) {y.cls+=" bg-primary text-white";chked=true;}yy.push(y);v++;}list.push(yy);}this.years=list;v=1;list=[];for(var i=0;i<4;i++) {var mm=[];for(var j=0;j<3;j++) {var m={v:v,cls:"col text-center"};if(chked) {//所选年份可见month=this.year*12+v-1;if(month>this.maxMonth||month<this.minMonth) {m.cls+=" text-grey";} else if(v==this.month) {m.cls+=" bg-primary text-white";}} else {m.cls+=" text-grey";}mm.push(m);v++;}list.push(mm);} this.months=list;
},
parse(s,def) {if(!s) {return def;}var cfg=s.trim().toLowerCase();var dt=new Date();if(cfg=="cur") {return {y:dt.getFullYear(),m:dt.getMonth()+1};}if(cfg.startsWith('-')) {var v = parseInt(cfg.substring(1));return {y:dt.getFullYear()-v, m:1};}if(cfg.startsWith('+')) {var v = parseInt(cfg.substring(1));return {y:dt.getFullYear()+v, m:1};}var y,m;var p=cfg.indexOf('/');if(p<0)p=cfg.indexOf('-');if(p<0)p=cfg.indexOf('.');if(p>0) {y=parseInt(cfg.substring(0,p));m=parseInt(cfg.substring(p+1));} else {y=parseInt(cfg);m=1;}return {y:y,m:m};
},
pageUp() {this.startYear-=12;this.set_array();
},
pageDn() {this.startYear+=12;this.set_array();
},
fore(){if(this.num<=this.minMonth)return;this.month--;if(this.month==0) {this.year--;this.month=12;}this.num=this.year*12+this.month-1;this.old={year:this.year, month:this.month,num:this.num};this.$emit('update:modelValue', this.old);
},
next(){if(this.num>=this.maxMonth)return;this.month++;if(this.month>12) {this.year++;this.month=1;}this.num=this.year*12+this.month-1;this.old={year:this.year, month:this.month,num:this.num};this.$emit('update:modelValue', this.old);
},
set_year(v) {var yMax=Math.ceil(this.maxMonth/12);var yMin=Math.floor(this.minMonth/12);if(v>yMax||v<yMin) {return;}this.month=-1;this.year=v;this.set_array();
},
set_month(v) {if(this.year<this.startYear||this.year>=this.startYear+12) {return;//未选择年份}var m=v-1+this.year*12;if(m>this.maxMonth||m<this.minMonth) {return; //不在有效范围内}this.month=v;if(v!=this.old.month||this.year!=this.old.year) {this.num=this.year*12+this.month-1;this.old={year:this.year, month:this.month,num:this.num};this.$emit('update:modelValue',this.old);}this.$refs._my_dlg.hide();
}
},
computed: {value: {get() {return this.year+'/'+(this.month>9?this.month:('0'+this.month))},set(v) {var ym=this.parse(v);this.year=ym.y;this.month=ym.m;this.num=this.year*12+this.month-1;}}
},
template: `
<div class="row"><div class="rol q-pr-lg"><q-icon name="navigate_before" @click="fore":class="num<=minMonth?'text-grey':''"></q-icon></div><div class="rol" style="cursor:pointer">{{year}} / {{month<10?('0'+month):month}}<q-popup-proxy cover @before-show="set_array" ref="_my_dlg"><div class="row q-pa-sm" style="min-width:20em;"><div class="col self-center"><q-icon name="navigate_before" @click="pageUp" size="2em" class="q-px-sm"></q-icon></div><div class="col-8"><div class="row" v-for="yy in years"><div v-for="y in yy" :class="y.cls" @click="set_year(y.v)"style="cursor:pointer">{{y.v}}</div></div><q-separator spaced="md"></q-separator><div class="row" v-for="mm in months"><div v-for="m in mm" :class="m.cls" @click="set_month(m.v)"style="cursor:pointer">{{m.v}}{{monthName}}</div></div></div><div class="col self-center"><q-icon name="navigate_next" @click="pageDn" size="2em" class="q-px-sm"></q-icon></div></div></q-popup-proxy></div><div class="rol q-pl-lg"><q-icon name="navigate_next" @click="next":class="num>=maxMonth?'text-grey':''"></q-icon></div>
</div>
`
}
相关文章:
基于quasar,只选择年度与月份的组件
为什么要做 quasar是个基于vue的强大的UI开发库,它提供了非常多的组件,比如日期选择。但是有些时候只需要选择到月份就可以了,quasar中没有,所以自己动手写了一个。因为对界面编程我不熟悉,所以,如果你有更…...
健康养生:拥抱生活的艺术
健康养生:拥抱生活的艺术 在快节奏的现代生活中,健康已成为我们最宝贵的财富。健康养生,不仅仅是一种生活方式的选择,更是一种对待生活的态度,它关乎于如何在日常中寻找到平衡,让身心得以滋养,…...
注意力机制+时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测
注意力机制时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测 目录 注意力机制时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测效果一览基本介绍程序设计参考资料 效果一览 基…...
uniapp 微信小程序 均分数据展示
效果图 数据展示,可自行搭配 html <view class"num-wrapper"><view class"num-item" click.stop"routerGo(跳转的地址)"><text class"num">¥{{ 要展示的数据 || 0}}</text><view…...
Nacos 3.0 考虑升级到 Spring Boot 3 + JDK 17 了!
Nacos 由阿里开源,是 Spring Cloud Alibaba 中的一个重要组件,主要用于发现、配置和管理微服务。 由于 Spring Boot 2 的维护已于近期停止,Nacos 团队考虑升级到 Spring Boot 3 JDK 17,目前正在征求意见和建议。 这其实是一件好…...
跟沐神学读论文-论文阅读管理
摘要 近期有读论文的需求,就需要去了解一下论文到底要怎么读,同一个系列之间的论文如何作整理和归纳,之前也有了解过市面上有成熟的论文阅读工具,但是对于学生党来讲没什么性价比,在B站上看到沐神有讲解他的思路Typor…...
Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署
当配置项存储在外部文件(如 XML、JSON)时,修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数,无需更改源代码,从而提升开发效率和代码可维护性。 1. 为什么选择 XML 配置文件 XML 配置文件具有多种优点…...
[SV]如何在UVM环境中使用C Model
在UVM环境中使用C Memory 一、C语言实现Memory 1.1 代码说明 Memory 初始化: memory_init() 函数将内存空间初始化为 0,并初始化互斥锁。AXI 写操作 (axi_write): 检查地址范围是否合法。使用 memcpy 将数据从输入缓冲区写入模拟内存。使用互斥锁保证线程安全。AXI 读操作 …...
十大开源的Cursor AI替代方案
随着AI的兴起,所使用的工具也在不断进步。Cursor AI 作为一个强大的编码助手,已经成为开发人员不可或缺的工具。开源替代方案提供了透明性、个性化和成本效益。本文深入探讨了Cursor AI 的十大开源替代方案,这些方案将丰富您的编码体验&#…...
相机光学(四十六)——镜头马达(VCM)控制策略模式
One Step Mode、Linear Slope Control(LSC)和Acceleration Control是三种不同的控制模式,它们在控制策略和应用场景上有所区别。这些控制模式在VCM中的应用是为了提高其性能,减少振动,加快响应速度,并提高定…...
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研落幕,本人本中游211,如愿以偿考入浙江大学,专业课842信号系统与数字电路140,总分410,和考前多次模考预期差距不大(建议大家平时做好定期模考测试,直接从实战分数中,找到复习的脉…...
了解ARM的千兆以太网——RK3588
1. 简介 本文并不重点讲解调试内容,重点了解以太网在ARM设计中的框架以及在设备树以及驱动的一个整体框架。了解作为一个驱动开发人员当拿到一款未开发过的ARM板卡应该怎么去把网卡配置使用起来。 2. 基础知识介绍 在嵌入式ARM中实现以太网的解决方案通常有以下两种…...
JavaFX使用jfoenix的UI控件
jfoenix还是一个不错的样式,推荐使用,而且也可以支持scene builder中的拖拖拽拽 需要注意的是过高的javafx版本可能会使得某些样式或控件无法使用 比如alert控件,亲测javaFX 19版本可以正常使用 1.在pom.xml中引入依赖 GitHub地址https://gi…...
Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
Hello! 认真好学的小伙伴们,大家好呀(Respect~)!我是 H u a z z i Huazzi Huazzi,欢迎观看本篇博客,接下来让我们一起来学习 Ubuntu命令大全 吧!祝你有所收获! 文章目录 前言&#x…...
单片机:实现教学上下课的自动打玲(附带源码)
单片机实现教学上下课的自动打铃 在学校或其他教育机构中,定时的打铃系统被广泛应用,用于提醒学生和老师上下课的时间。一个简单的自动打铃系统可以通过单片机实现,结合蜂鸣器和定时器控制,可以在设定的时间点自动打铃࿰…...
进程通信方式---共享映射区(无血缘关系用的)
5.共享映射区(无血缘关系用的) 文章目录 5.共享映射区(无血缘关系用的)1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理:共享映射区是将文件…...
深度学习实战智能交通计数
本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化,该数据集包含丰富的车辆目标图像样本…...
【MySQL】MySQL表的操作
【MySQL】MySQL表的操作 🥕个人主页:开敲🍉 🔥所属专栏:MySQL🍋 🌼文章目录🌼 1. 创建表 2. 查看表结构 3. 修改表 4. 删除表 1. 创建表 create table table_name(表名称)( fiel…...
Redis篇-12--数据结构篇4--Hash内存模型(数组,链表,压缩列表zipList,哈希表,短结构)
Redis的Hash数据结构用于存储键值对(key-value形式)的集合(类似java中HashMap或对象)。为了在保证高效性能的同时节省内存,Redis对Hash的底层实现进行了多种优化。特别是通过使用压缩列表(ziplistÿ…...
二、windows环境下vscode使用wsl教程
本篇文件介绍了在windows系统使用vscode如何连接使用wsl,方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode,按快捷键CtrlShiftX打开插件市场,搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
