DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕

共同探索软件研发!敬请关注【宝码香车】

csdngif标识

目录

  • DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)
    • 📚前言
    • 📚页面效果
    • 📚指令输入
      • 定义属性
        • 时间相关
        • 组件状态相关
        • 样式与布局相关
        • 其他
      • 定义事件
      • 其他
    • 📚think
      • 📘组件代码
    • 📚代码测试
    • 📚整理后主要代码
      • 📘定义组件 TimePicker.vue
      • 📘调用 TimePickerView.vue
    • 📚测试代码正常跑通,附其他基本代码
      • 📘编写路由 src\router\index.js
      • 📘编写展示入口 src\App.vue
    • 📚页面效果


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

📚前言

在当今这个科技飞速发展的时代,人工智能(AI)无疑是最为耀眼的领域之一。从智能语音助手到自动驾驶汽车,从图像识别技术到自然语言处理,AI 正以前所未有的速度渗透到我们生活的方方面面,深刻地改变着我们的生活方式和工作模式。而在这波澜壮阔的 AI 浪潮中,DeepSeek 宛如一颗璀璨的新星,迅速崛起,吸引了全球的目光。

📚页面效果

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

📚指令输入

已经创建好了一个基于Vue3的组合式API的项目(Composition API),并能正常运行起来,请帮我用 Vue3的组合式API(Composition API) 生成一个 时间选择器(Time Picker) 的功能组件,所有代码都保存在components/TimePicker 下的文件夹中。功能组件的script标签中只有setup属性,使用普通 JavaScript 实现,不使用TypeScript。
功能要有,如下属性:

定义属性

时间相关
  1. value
    • 作用:绑定当前选择的时间值,支持双向绑定。
    • 类型:StringDate
    • 默认值:null
  2. defaultValue
    • 作用:设置时间选择器的默认时间。
    • 类型:StringDate
    • 默认值:当前时间
  3. format
    • 作用:指定时间的显示格式,如 HH:mm:ssHH:mm 等。
    • 类型:String
    • 默认值:HH:mm
  4. disabledHours
    • 作用:设置不可选择的小时列表。
    • 类型:Array<Number>
    • 默认值:[]
  5. disabledMinutes
    • 作用:设置不可选择的分钟列表。
    • 类型:Array<Number>
    • 默认值:[]
  6. disabledSeconds
    • 作用:设置不可选择的秒数列表。
    • 类型:Array<Number>
    • 默认值:[]
组件状态相关
  1. readonly
    • 作用:设置时间选择器是否为只读状态。
    • 类型:Boolean
    • 默认值:false
  2. disabled
    • 作用:设置时间选择器是否禁用。
    • 类型:Boolean
    • 默认值:false
  3. visible
    • 作用:控制时间选择面板的显示与隐藏,支持双向绑定。
    • 类型:Boolean
    • 默认值:false
样式与布局相关
  1. placement
    • 作用:设置时间选择面板的弹出位置,如 topbottomleftright 等。
    • 类型:String
    • 默认值:bottom
  2. size
    • 作用:设置时间选择器的尺寸,如 smallmediumlarge
    • 类型:String
    • 默认值:medium
其他
  1. showSeconds
    • 作用:设置是否显示秒数选择。
    • 类型:Boolean
    • 默认值:false

定义事件

  1. update:value
    • 作用:当选择的时间值发生变化时触发,用于实现双向绑定。
    • 参数:StringDate,新的时间值。
  2. update:visible
    • 作用:当时间选择面板的显示状态发生变化时触发,用于实现双向绑定。
    • 参数:Boolean,新的显示状态。
  3. change
    • 作用:当用户完成时间选择操作时触发。
    • 参数:StringDate,选择的时间值。
  4. open
    • 作用:当时间选择面板打开时触发。
  5. close
    • 作用:当时间选择面板关闭时触发。

其他

  1. 提供插槽:使用 Vue 的插槽机制,允许用户自定义时间选择器的输入框内容、时间选择面板的样式等,增加组件的灵活性。
  2. 键盘交互:支持通过键盘上下左右箭头键选择时间,以及使用回车键确认选择,提升用户操作体验。
  3. 国际化支持:支持不同语言的时间显示和提示信息,方便不同地区的用户使用。
  4. 动画效果:为时间选择面板的显示和隐藏添加淡入淡出等动画效果,增强用户体验。
  5. 样式定制:提供一些样式类名或 CSS 变量,方便用户自定义时间选择器的样式,如颜色、字体、边框等。
  6. 文档和示例:编写详细的文档,说明每个属性和事件的作用,并提供多种使用示例,方便其他开发者使用该组件。

你有更好的建议也可以添加,要注明。组件定义好后给出5个及以上的调用示例,示例中添加完整的数据和事件,确保每个示例是独立的。
下面是现有目录
DeepSeekAndVue/
├── src/ # 源代码目录
│ ├── assets/ # 静态资源
│ │ ├── base.css
│ │ ├── main.css
│ │ └── logo.svg
│ ├── components/ # 组件目录
│ │ ├── HelloWorld.vue
│ │ ├── TheWelcome.vue
│ │ ├── WelcomeItem.vue
│ │ ├── Progress/
│ │ │ └── Progress.vue
│ │ ├── Accordion/
│ │ ├── BackToTop/
│ │ ├── Card/
│ │ ├── InfiniteScroll/
│ │ ├── Notification/
│ │ ├── Timeline/
│ │ ├── Switch/
│ │ ├── Tabs/
│ │ ├── Sidebar/
│ │ ├── Breadcrumbs/
│ │ ├── MasonryLayout/
│ │ ├── Rating/
│ │ ├── ColorPicker/
│ │ ├── RightClickMenu/
│ │ ├── RangePicker/
│ │ ├── Navbar/
│ │ ├── FormValidation/
│ │ ├── CopyToClipboard/
│ │ ├── ClickAnimations/
│ │ ├── ThumbnailList/
│ │ ├── KeyboardShortcuts/
│ │ ├── CommentSystem/
│ │ ├── QRCode/
│ │ ├── RadioButton/
│ │ ├── Slider/
│ │ ├── ScrollAnimations/
│ │ ├── TextInput/
│ │ ├── Divider/
│ │ ├── Checkbox/
│ │ ├── TagInput/
│ │ ├── DropdownSelect/
│ │ ├── List/
│ │ ├── Header/
│ │ ├── Footer/
│ │ ├── Pagination/
│ │ ├── FloatingActionButton/
│ │ ├── PasswordInput/
│ │ ├── GridLayout/
│ │ ├── Flexbox/
│ │ ├── Modal/
│ │ ├── RichTextEditor/
│ │ ├── TimePicker/
│ │ ├── DatePicker/
│ │ └── icons/
│ ├── router/ # 路由配置
│ │ └── index.js
│ ├── stores/ # Pinia 状态管理
│ │ └── counter.js
│ ├── views/ # 页面组件
│ │ ├── ProgressView.vue
│ │ ├── TabsView.vue
│ │ ├── SwitchView.vue
│ │ ├── TimelineView.vue
│ │ ├── NotificationView.vue
│ │ ├── CardView.vue
│ │ ├── InfiniteScrollView.vue
│ │ ├── BackToTopView.vue
│ │ ├── AccordionView.vue
│ │ ├── SidebarView.vue
│ │ ├── BreadcrumbsView.vue
│ │ ├── MasonryLayoutView.vue
│ │ ├── RatingView.vue
│ │ ├── ColorPickerView.vue
│ │ ├── RightClickMenuView.vue
│ │ ├── RangePickerView.vue
│ │ ├── NavbarView.vue
│ │ ├── FormValidationView.vue
│ │ ├── CopyToClipboardView.vue
│ │ ├── ClickAnimationsView.vue
│ │ ├── ThumbnailListView.vue
│ │ ├── KeyboardShortcutsView.vue
│ │ ├── CommentSystemView.vue
│ │ ├── QRCodeView.vue
│ │ ├── RadioButtonView.vue
│ │ ├── SliderView.vue
│ │ ├── ScrollAnimationsView.vue
│ │ ├── TextInputView.vue
│ │ ├── DividerView.vue
│ │ ├── CheckboxView.vue
│ │ ├── TagInputView.vue
│ │ ├── DropdownSelectView.vue
│ │ ├── ListView.vue
│ │ ├── HeaderView.vue
│ │ ├── FooterView.vue
│ │ ├── PaginationView.vue
│ │ ├── FloatingActionButtonView.vue
│ │ ├── GridLayoutView.vue
│ │ ├── PasswordInputView.vue
│ │ ├── FlexboxView.vue
│ │ ├── ModalView.vue
│ │ ├── RichTextEditorView.vue
│ │ ├── TimePickerView.vue
│ │ ├── DatePickerView.vue
│ │ └── AboutView.vue
│ ├── App.vue # 根组件
│ └── main.js # 应用入口
├── public/ # 公共资源目录
├── index.html # HTML 模板
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── node_modules/ # 依赖包目录

📚think

📘组件代码

我将按照您的要求创建时间选择器组件。以下是组件的实现步骤:

  1. 首先在项目目录下创建组件文件:
components/TimePicker/TimePicker.vue
  1. 组件实现代码:
<!-- components/TimePicker/TimePicker.vue -->
<template>
  <div class="deep-time-picker" :class="[sizeClass, placementClass]">
    <!-- 输入框插槽 -->
    <div class="time-input-wrapper" @click="togglePicker">
      <slot name="trigger">
        <input
          class="time-input"
          type="text"
          :value="displayTime"
          :readonly="readonly"
          :disabled="disabled"
          :placeholder="placeholder"
        />
      </slot>
    </div>

    <!-- 时间选择面板 -->
    <transition name="fade">
      <div
        v-if="visible && !disabled"
        class="time-panel"
        :class="placement"
        @click.stop
      >
        <div class="time-columns">
          <!-- 小时列 -->
          <div class="time-column">
            <div class="column-header">{
  { hourLabel }}</div>
            <ul ref="hourList" class="column-list">
              <li
                v-for="h in hours"
                :key="h.value"
                :class="[
                  { active: h.value === currentHour, disabled: h.disabled }
                ]"
                @click="selectHour(h.value)"
                @keydown="handleKeyDown($event, 'hour', h.value)"
                :tabindex="h.disabled ? -1 : 0"
              >
                {
  { h.formatted }}
              </li>
            </ul>
          </div>

          <!-- 分钟列 -->
          <div class="time-column">
            <div class="column-header">{
  { minuteLabel }}</div>
            <ul ref="minuteList" class="column-list">
              <li
                v-for="m in minutes"
                :key="m.value"
                :class="[
                  { active: m.value === currentMinute, disabled: m.disabled }
                ]"
                @click="selectMinute(m.value)"
                @keydown="handleKeyDown($event, 'minute', m.value)"
                :tabindex="m.disabled ? -1 : 0"
              >
                {
  { m.formatted }}
              </li>
            </ul>
          </div>

          <!-- 秒数列 -->
          <div v-if="showSeconds" class="time-column">
            <div class="column-header">{
  { secondLabel }}</div>
            <ul ref="secondList" class="column-list">
              <li
                v-for="s in seconds"
                :key="s.value"
                :class="[
                  { active: s.value === currentSecond, disabled: s.disabled }
                ]"
                @click="selectSecond(s.value)"
                @keydown="handleKeyDown($event, 'second', s.value)"
                :tabindex="s.disabled ? -1 : 0"
              >
                {
  { s.formatted }}
              </li>
            </ul>
          </div>
        </div>

        <!-- 面板底部操作 -->
        <div class="panel-footer">
          <slot name="footer">
            <button class="confirm-btn" @click="confirmSelection">
              {
  { confirmText }}
            </button>
          </slot>
        </div>
      </div>
    </transition>
  </div>
</template>

<script setup>
import {
      ref, computed, watch, toRefs, onMounted } from 'vue'
import dayjs from 'dayjs'

const emit = defineEmits([
  'update:value',
  'update:visible',
  'change',
  'open',
  'close'
])

const props = defineProps({
     
  value: {
      type: [String, Date], default: null },
  defaultValue: {
      type: [String, Date], default: () => new Date() },
  format: {
      type: String, default: 'HH:mm' },
  disabledHours: {
      type: Array, default: () => [] },
  disabledMinutes: {
      type: Array, default: () => [] },
  disabledSeconds: {
      type: Array, default: () => [] },
  readonly: {
      type: Boolean, default: false },
  disabled: {
      type: Boolean, default: false },
  visible: {
      type: Boolean, default: false },
  placement: {
      type: String, default: 'bottom' },
  size: {
      type: String, default: 'medium' },
  showSeconds: {
      type: Boolean, default: false }
})

// 国际化默认配置
const i18n = {
     
  hour: 'Hour',
  minute: 'Minute',
  second: 'Second',
  confirm: 'OK'
}

// 转换props为响应式引用
const {
      
  value, 
  defaultValue, 
  format,
  disabledHours,
  disabledMinutes,
  disabledSeconds,
  visible,
  showSeconds
} = toRefs(props)

// 当前时间状态
const currentTime = ref(dayjs(value?.value || defaultValue?.value))
const currentHour = ref(currentTime.value.hour())
const currentMinute = ref(currentTime.value.minute())
const currentSecond = ref(currentTime.value.second())

// DOM引用
const hourList = ref(null)
const minuteList = ref(null)
const secondList = ref(null)

// 计算显示时间
const displayTime = computed(() => {
     
  return currentTime.value.format(format.value)
})

// 尺寸类名
const sizeClass = computed(() => `size-${
       props.size}`)

// 位置类名
const placementClass = computed(() => `placement-${
       props.placement}`)

// 生成时间选项
const generateOptions = (type) => {
     
  const max = type === 'hour' ? 23 : 59
  const disabled = props[`disabled${
       type.charAt(0).toUpperCase() + type.slice(1)}s`]
  
  return Array.from({
      length: max + 1 }, (_, i) => {
     
    const value = i
    const formatted = i.toString().padStart(2, '0')
    return {
     
      value,
      formatted,
      disabled: disabled.includes(value)
    }
  })
}

const hours = computed(() => generateOptions('hour'))
const minutes = computed(() => generateOptions('minute'))
const seconds = computed(() => generateOptions('second'))

// 切换选择器可见状态
const togglePicker = () => {
     
  if (props.readonly || props.disabled) return
  const newVisible = !visible.value
  emit('update:visible', newVisible)
  if (newVisible) emit('open')
  else emit(

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「多开浏览器」颜值升级之「消灭堆叠的窗口」(二)

01 传统指纹浏览器的架构 传统指纹浏览器&#xff08;也称为多用户浏览器或反检测浏览器&#xff09;是一种用于模拟多个独立用户环境的技术工具&#xff0c;主要用于网络爬虫、广告验证、社交媒体管理等场景。其核心目标是通过模拟不同的浏览器指纹&#xff08;Browser Finge…

IndexError: index 0 is out of bounds for axis 1 with size 0

IndexError: index 0 is out of bounds for axis 1 with size 0 欢迎来到英杰社区&#xff0c;这里是博主英杰https://bbs.csdn.net/topics/617804998 报错原因 数组或数据结构为空 如果数组或 DataFrame 在指定的维度上没有任何元素&#xff08;例如&#xff0c;没有列&#x…

本地部署阿里万象2.1文生视频模型(Wan2.1-T2V)完全指南

在生成式AI技术爆发式发展的今天,阿里云开源的万象2.1(Wan2.1)视频生成模型,为创作者提供了从文字/图像到高清视频的一站式解决方案。本文针对消费级显卡用户,以RTX 4060 Ti 16G为例,详解本地部署全流程与性能调优方案,涵盖环境配置、多模型选择策略、显存优化技巧及实战…

[Python学习日记-85] 并发编程之多进程 —— Process 类、join 方法、僵尸进程与孤儿进程

[Python学习日记-85] 并发编程之多进程 —— Process 类、join 方法、僵尸进程与孤儿进程 简介 multiprocessing 模块 Process 类 僵尸进程与孤儿进程 简介 在前面的进程理论的介绍当中我们已经介绍了进程的概念、并发与并行的区别以及进程并发的实现理论&#xff0c;这些都…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中&#xff0c;单条数据的日期拿取&#xff0c;并判断上下班打卡情况。代码可能满足不了大部分需求&#xff0c;目前只够本公司用&#xff0c;如果需要&#xff0c;可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…

Python项目】基于Python的图像去雾算法研究和系统实现

Python项目】基于Python的图像去雾算法研究和系统实现 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;图像去雾系统主要是基于暗通道先验和逆深度估计技术的去雾算法&#xff0c;系统功能模块分为&#xff08;1&#xff09;图像上传模块&…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机&#xff0c;如笔记本等都是按照冯诺依曼来设计的&#xff1a; 截止目前&#xff0c;我们所知道的计算机都是由一个一个的硬件组装起来的&#xff0c;这些硬件又由于功能的不同被分为了输入设备&#xff0c;输出设备&#xff0c;存储器…

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…

模块11_面向对象

文章目录 模块11_面向对象模块十回顾&&模块十一重点 第一章.接口1.接口的介绍2.接口的定义以及使用3.接口中的成员3.1抽象方法3.2默认方法3.3静态方法3.4成员变量3.4成员变量 4.接口的特点5.接口和抽象类的区别 第二章.多态1.多态的介绍2.多态的基本使用3.多态的条件下…

常见webshell工具的流量特征

1、蚁剑 1.1、蚁剑webshell静态特征 蚁剑中php使用assert、eval执行&#xff1b;asp只有eval执行&#xff1b;在jsp使用的是Java类加载&#xff08;ClassLoader&#xff09;&#xff0c;同时会带有base64编码解码等字符特征。 1.2、蚁剑webshell动态特征 查看流量分析会发现…

03标准IO接口

一、系统与标准IO的区别 相同点:系统IO与标准IO都可以操作linux系统下的文件。 ⭐不同点: 系统IO&#xff1a;打开文件得到的是一个整数&#xff0c;称为文件描述符。 标准IO&#xff1a;打开文件得到的是一个指针&#xff0c;称为文件指针。系统IO&#xff1a;可以访问linux…

Axure高保真Element框架元件库

点击下载《Axure高保真Element框架元件库》 原型效果&#xff1a;https://axhub.im/ax9/9da2109b9c68749a/#g1 摘要 本文详细阐述了在 Axure 环境下打造的一套高度还原 Element 框架的组件元件集。通过对 Element 框架组件的深入剖析&#xff0c;结合 Axure 的强大功能&#…

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢&#xff1f;有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达&#xff1a;指 操作系统 将一个信号&#xff08;Signal…

【FL0090】基于SSM和微信小程序的球馆预约系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

因子分析讲解

一、定义 因子分析&#xff08;Factor Analysis&#xff09;是一种常用于多变量统计分析的方法&#xff0c;主要用于数据降维、识别潜在的结构、理解变量间的关系。它通过将一组观察变量&#xff08;通常是高度相关的变量&#xff09;转化为一组较少的、互不相关的因子&#x…

从 JVM 源码(HotSpot)看 synchronized 原理

大家好&#xff0c;我是此林。 不知道大家有没有这样一种感觉&#xff0c;网上对于一些 Java 框架和类的原理实现众说纷纭&#xff0c;看了总是不明白、不透彻。常常会想&#xff1a;真的是这样吗&#xff1f; 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…

Metal学习笔记十一:贴图和材质

在上一章中&#xff0c;您设置了一个简单的 Phong 光照模型。近年来&#xff0c;研究人员在基于物理的渲染 &#xff08;PBR&#xff09; 方面取得了长足的进步。PBR 尝试准确表示真实世界的着色&#xff0c;真实世界中离开表面的光量小于表面接收的光量。在现实世界中&#xf…

zabbix“专家坐诊”第277期问答

在线答疑:乐维社区 问题一 Q&#xff1a;这个怎么解决呢&#xff1f; A&#xff1a;缺少这个依赖。 Q&#xff1a;就一直装不上。 A&#xff1a;装 zabbix-agent2-7.0.0-releasel.el7.x86 64 需要前面提示的那个依赖才可以装。 问题二 Q&#xff1a;大佬&#xff0c;如果agen…