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.xdnf.cn/news/35192.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Bean 的生命周期和获取方式

优质博文&#xff1a;IT-BLOG-CN 一、Spring Bean 的生命周期&#xff0c;如何被管理的 对于普通的 Java对象&#xff0c;当 new的时候创建对象&#xff0c;当它没有任何引用的时候被垃圾回收机制回收。而由 Spring IoC容器托管的对象&#xff0c;它们的生命周期完全由容器控…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

使用Python创建API服务器并打包成exe文件

本文来记录下使用Python创建API服务器并打包成exe文件 文章目录 概述简述API服务器创建打包API服务器为exe文件本文小结 概述 在软件开发中&#xff0c;API服务器是连接前端和后端服务的桥梁&#xff0c;而Python因其丰富的库和框架&#xff0c;如Flask、Django等&#xff0c;成…

MHA切换过程

MHA&#xff08;Master High Availability&#xff09;是一套用于MySQL数据库的高可用性解决方案&#xff0c;它能够在主服务器发生故障时自动将一个从服务器提升为新的主服务器&#xff0c;从而实现数据库服务的持续可用。MHA的切换过程主要包括以下几个步骤&#xff1a; 1. …

NextUI 教程:打造美观高效的React UI

NextUI 教程&#xff1a;打造美观高效的React UI 项目地址:https://gitcode.com/gh_mirrors/ne/nextui 1. 项目介绍 NextUI 是一个轻量级、快速且现代化的React UI库&#xff0c;提供了一系列优雅的组件以帮助开发者构建令人印象深刻的Web应用。它注重性能和用户体验&#x…

Python和Java后端开发技术对比

在当今互联网技术飞速发展的时代&#xff0c;后端开发扮演着至关重要的角色。Python和Java作为两大主流的后端开发语言&#xff0c;各自具备独特的优势和应用场景。让我们深入了解这两种技术的特点和选择建议。 Java后端开发一直是企业级应用的首选方案。它以强大的类型系统、…

Java HashMap

HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是无序的&#x…

模型案例:| 帐篷检测模型!

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

实验日志——DETR

DETR训练日志 1. 代码来源 代码源自作者的Github: https://github.com/facebookresearch/detr?tabreadme-ov-file 2. 数据来源 在DETR中只使用了COCO2017数据集&#xff0c;其中训练集有118288张图像&#xff0c;验证集有5001张数据&#xff0c;测试集有40671张数据&#…

18、IO流:

18、IO流&#xff1a; 这一章很枯燥无聊~ 文件&#xff1a; 什么是文件&#xff1a; 文件&#xff0c;对我们并不陌生&#xff0c;文件时保存数据的地方&#xff0c;比如我们经常使用的word文档&#xff0c;txt文档&#xff0c;excel文档…都是文件。它既可以保存一张图片&…

24.两两交换链表中的节点 python

两两交换链表中的节点 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解解题思路python实现代码解读提交结果 题目 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须…

解决 git 报错 “fatal: unable to access ‘https://github.com/.../.git‘: Recv failure Connection was rese

目录 前言 方法一&#xff1a;取消代理设置 方法二&#xff1a;设置系统代理&#xff08;推荐&#xff09; 方法三 方法四&#xff1a;不挂梯子时 前言 在使用 Git/Git小乌龟 进行代码管理的过程中&#xff0c;经常会遇到各种各样的问题&#xff0c;其中之一就是在执行 g…

推荐8款自动化软件测试必备工具

在现代软件测试开发领域&#xff0c;自动化测试工具的使用已经变得至关重要。 这些工具不仅提高了测试效率&#xff0c;还确保了软件质量和稳定性。 本文将向您介绍8款自动化软件测试必备工具&#xff0c;它们涵盖了各个层面的测试需求&#xff0c;从而助力测试团队更好地应对…

MySQL聚合函数查询

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

Vue3 完结

组合式API - setup选项 组合式API可理解为一系列函数&#xff0c;通常需要调用这些函数去编写将来的组件逻辑&#xff1b; 而setup为组合式API的入口&#xff08;只有先写了setup才能往里写组合式API的函数&#xff09; setup选项的写法及执行时机 执行时机在beforeCreate之前…

简洁的移动端登录注册界面

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"content"><view class&quo…

2024NIPS | 在目标引导下利用强化学习范式进行图像冲印调优

文章标题&#xff1a;Goal Conditioned Reinforcement Learning for Photo Finishing Tuning 原文链接&#xff1a;RLPixTuner 本文是上海AI Lab联合香港中文大学&#xff08;薛天帆等人&#xff09;发表在2024NIPS上的论文。 1. Abstract 图像冲印调优旨在自动化对图像冲印管…

【Spring】Cookie与Session

一、Cookie是什么&#xff1f; Cookie的存在主要是为了解决HTTP协议的无状态性问题&#xff0c;即协议本身无法记住用户之前的操作。 “状态” 的含义指的是: 默认情况下 HTTP 协议的客端和服务器之间的这次通信&#xff0c;和下次通信之间没有直接的联系 但是实际开发中&…

【最新】linux安装docker并配置加速源

我这边之前本地创建了个虚拟机&#xff0c;linux系统的&#xff0c;用于部署服务器。有时安装一些常用工具或者中间件&#xff0c;还是用docker安装方便&#xff0c;而且docker还有编排服务等功能&#xff0c;实际使用中还是会省不少事的&#xff0c;这里记录下安装docker的过程…

SpringBoot动态配置Nacos

重要知识点 Nacos属性的简单使用将SpringBoot中的所有配置全部放入到Nacos中开发人创建单独的命名空间,修改互不影响Nacos经常变动的配置抽离到外部文件中 将项目中的所有配置全部放到到 1. 首先引入包 <!-- nacos 接入--><!-- https://mvnrepository.com/artifact…