uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法

在这里插入图片描述

前言

在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现,因为官方有很多相关的功能和方法在文档中没有说明清楚,所以我做了许多调试,终于完成了。

基础使用

1. 组件引入

<template><view class="datetime-picker-container"><view class="picker-wrapper" @click="openPicker"><text class="picker-label">选择日期:</text><view class="picker-input">{{getTimeYearAndMouth(yearMonth)}}</view></view><up-datetime-pickerv-if="selectTimeStampList.length > 0"v-model="yearMonth"mode="year-month":show="timeSelectShow":formatter="formatter":filter="filterTime"format="YYYY-MM"@cancel="cancelPicker"@confirm="confirmPicker"/></view>
</template>

2. 基础数据定义

// 当前选中的时间戳
const yearMonth = ref(Date.now())
// 控制选择器显示/隐藏
const timeSelectShow = ref(false)
// 可选时间戳列表
const selectTimeStampList = reactive<number[]>([])
// 年份去重数组 - 关键数据结构
const fitterTheSameYears = reactive<number[]>([])

核心实现

1. 时间映射表

// 创建一个 Map 来存储有效的年月组合
const validDateMap = computed(() => {const dateMap = new Map()if (!selectTimeStampList?.length) {return dateMap}selectTimeStampList.forEach(timestamp => {const date = new Date(timestamp)const year = date.getFullYear()const month = date.getMonth() + 1if (!dateMap.has(year)) {dateMap.set(year, new Set())}dateMap.get(year).add(month)})return dateMap
})

2. 格式化器实现

重点,如果没有按照规范过滤的话会产生一系列问题。

const formatter = (type: string, value: number) => {// 处理特殊情况,当切换年月份的时候最后会传进两个被选择的参数,所以需要处理 [2024, 01] 的情况if (value.toString().length < 5){if (type === 'year') {return `${value}`}if (type === 'month') {fitterTheSameYears.length = 0  // 重要: 清空年份数组// 判断月份字符串是否以 0 开头,如果是的话,则取第二个字符,否则取整个字符串 ,因为这样的格式才能正常选中return value.startsWith('0') ? `${value[1]}` : `${value}`}}// 基础类型检查if (!value || typeof value !== 'number') {return ''}const date = new Date(value)const year = date.getFullYear()const month = date.getMonth() + 1if (type === 'year') {if (!validDateMap.value.size) {return `${year}`}// 检查是否是有效年份并去重if (validDateMap.value.has(year) && !fitterTheSameYears.includes(year)) {fitterTheSameYears.push(year)return `${year}`}return null}if (type === 'month') {if (!validDateMap.value.size) {return `${month}`}// 检查当前年份下的月份是否有效const currentYear = new Date(yearMonth.value || Date.now()).getFullYear()const validMonths = validDateMap.value.get(currentYear)if (validMonths && validMonths.has(month)) {return `${month}`}return null}return value.toString()
}

3. 事件处理方法

// 打开选择器
const openPicker = () => {timeSelectShow.value = true
}// 格式化显示时间
const getTimeYearAndMouth = (timestamp: number) => {const date = new Date(timestamp)return `${date.getFullYear()}${date.getMonth() + 1}`
}// 确认选择
const confirmPicker = (data) => {yearMonth.value = data.valuetimeSelectShow.value = false// 这里可以添加选择后的业务处理逻辑
}// 取消选择
const cancelPicker = () => {timeSelectShow.value = false
}

重要说明

1. fitterTheSameYears的作用

  • 用于存储已处理的年份,防止重复显示
  • 在切换到月份选择时需要清空
  • 确保年份选项的唯一性

2. formatter函数的关键点

  • 需要处理特殊的数值情况
  • 年份和月份的显示格式化
  • 配合fitterTheSameYears进行年份去重
  • 根据validDateMap过滤无效选项

3. 时间选择的注意事项

  • 切换年份时会影响可选月份
  • 确保时间戳格式统一
  • 处理无数据的边界情况

常见问题

1. 无法切换年份或月份

可能的原因:

  • formatter返回值不正确
  • fitterTheSameYears未正确维护
  • validDateMap数据异常

解决方案:

  • 检查formatter的返回值
  • 确保在适当时机清空fitterTheSameYears
  • 验证时间戳列表的正确性

2. 显示异常

可能的原因:

  • 时间戳格式不统一
  • 特殊数值处理不当
  • v-if条件判断有误

解决方案:

  • 统一使用毫秒级时间戳
  • 完善特殊情况的处理
  • 检查组件显示条件

最佳实践

  1. 数据初始化
  • 确保selectTimeStampList在使用前已正确初始化
  • 使用reactive而不是ref定义数组
  • 注意时间戳格式的统一性
  1. 性能优化
  • 使用computed缓存validDateMap
  • 避免在formatter中进行复杂计算
  • 合理使用v-if控制组件渲染
  1. 用户体验
  • 提供清晰的时间选择提示
  • 处理好加载状态
  • 确保选择器操作流畅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高质量翻译在美国推广移动应用中的重要性

美国的移动应用市场是世界上竞争最激烈、利润最高的市场之一&#xff0c;为开发者提供了接触数百万潜在用户的机会。然而&#xff0c;进入这个市场需要的不仅仅是创新技术或令人信服的想法&#xff1b;它要求与目标受众进行有效地沟通和文化契合。在这个过程中&#xff0c;高质…

基于Python的PDF批量转化工具

一、开发的缘由 最近&#xff0c;有网友想让我帮他做一个批量把png, docx, doc, pptx, ppt, xls, xlsx文件转化为PDF格式的软件&#xff0c;完全傻瓜式的操作&#xff0c;把文件拖进去就进行转化那种&#xff0c;简单实用。之前&#xff0c;有过一个vbs的文件&#xff0c;可以…

模型案例:| 手机识别模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

【Copilot 】TAB keybinding not working on JetBrains Client

pycharm ssh 远程到ubuntu24.04 发现tab就是tab,无法输出copilot给出的自动补全到便捷器里。禁用host的copilot插件,重新启动ide就好了。解决办法 参考大神的办法删除主机和客户端插件中的 Copilot插件。 仅在客户端中重新安装 Copilot 插件。 我只是禁用也可以 对比了键盘映…

【Linux】程序的编译过程

程序的翻译过程 预处理&#xff08;头文件展开&#xff0c;条件编译&#xff0c;宏替换&#xff0c;去注释&#xff09;编译 &#xff1a;把c变成汇编语言汇编 &#xff1a;把汇编变成二进制&#xff08;不可执行&#xff0c;二进制目标文件&#xff09;链接 &#xff1a;把自…

Trunk链路操作题

Trunk链路操作题 论证&#xff1a;

【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题

实验 7&#xff1a;默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步&#xff…

特殊的数学性质

一个数模9的结果等于它的每一位数相加和模9

JSP知识点总结

jsp九大对象 在jsp中内置了9个对象&#xff0c;无需创建该对象即可使用。其名称为固定名称。 1.out输出对象 - 属于JspWriter print(): 输出 flush(): 刷新 close(): 关闭 2.request请求对象 - 属于HttpServletRequest getParameter(): 获取请求的参数 setCharacterEncodin…

电子信息工程自动化 基于单片机的居室安全报警系统

摘要 本课题设计了基于STM32F103C6T6单片机为主控核心的居室安全报警系统。为了解决家庭居室的安全监控&#xff0c;通过温湿度芯片SHT30、烟雾传感器MQ-2、天然气传感器MQ-4来获取居室的温湿度、烟雾、天然气含量&#xff0c;使用了一个热释电传感器、菲涅耳透镜、红外传感信…

【vue3 for beginner】Pinia基本用法:存储user的信息

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库&#xff0c;是 Vuex 的…

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…

React基础知识四 Hooks

什么是hooks&#xff1f; (coderwhy) hooks是react 16.8&#xff08;2019年&#xff09;出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候&#xff0c;函数式组件是非常鸡肋的&#xff0c;几乎没什么用。因…

电子病历静态数据脱敏路径探索

一、引言 数据脱敏&#xff08;Data Masking&#xff09;&#xff0c;屏蔽敏感数据&#xff0c;对某些敏感信息&#xff08;比如patient_name、ip_no、ad、no、icd11、drug等等 &#xff09;通过脱敏规则进行数据的变形&#xff0c;实现隐私数据的可靠保护。电子病历作为医疗领…

AIGC 012-Video LDM-更进一步,SD作者将LDM扩展到视频生成任务!

AIGC 012-Video LDM-Stable Video diffusion前身&#xff0c;将LDM扩展到视频生成任务&#xff01; 文章目录 0 论文工作1论文方法实验结果 0 论文工作 Video LDM作者也是Stable diffusion的作者&#xff0c;作者在SD的架构上进行扩展&#xff0c;实现了视频的生成。后续在Vid…

ABAP DIALOG屏幕编程1

一、DIALOG屏幕编程 DIALOG屏幕编程是SAP ABAP中用于创建用户交互界面的一种技术&#xff0c;主要用于开发事务性应用程序。它允许用户通过屏幕输入或操作数据&#xff0c;程序根据用户的操作执行逻辑处理。 1、DIALOG编程的主要组件 a、屏幕 (Screen) DIALOG程序的核心部分…

青训营-豆包MarsCode技术训练营试题解析二十七

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目。该项目的目标是培养具有职业竞争力的优秀开发工程师&#xff0c;并提供全程免费的课程&#xff0c;不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵盖前端、后端和AI方向。在这个飞…

人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换

接触人工智能的学习三个月了&#xff0c;每天与各种安装包作斗争&#xff0c;缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装&#xff0c;是时候总结一下踩过的坑和积累的经验了。 以一个典型的…

华为关键词覆盖应用市场ASO优化覆盖技巧

在我国的消费者群体当中&#xff0c;华为的品牌形象较高&#xff0c;且产品质量过硬&#xff0c;因此用户基数也大。与此同时&#xff0c;随着影响力的增大&#xff0c;华为不断向外扩张&#xff0c;也逐渐成为了海外市场的香饽饽。作为开发者和运营者&#xff0c;我们要认识到…

Vue+Vite 组件开发的环境配置(超级简单)

vite是什么 Vite 是一个现代化的前端构建工具和开发服务器&#xff0c;它特别适用于构建大型的单页面应用&#xff08;SPA&#xff09;。Vite 旨在提供极快的冷启动速度&#xff0c;并且能够即时地&#xff08;几乎实时地&#xff09;更新模块&#xff0c;这得益于其利用原生 …