自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

🕓 自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

? 一個靈活實用的時間范圍選擇器,支持開始時間、結束時間、快捷時間選項、本地雙向綁定、插槽擴展等功能。


在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

📘 一、功能介紹

該組件基于 Element Plus<el-date-picker><el-select> 封裝,支持以下特性:

  • v-model:startTimev-model:endTime 雙向綁定;
  • 常用時間快捷選項:今天、昨天、本月、上月等;
  • 自定義插槽 before,可拓展前置內容;
  • 自動識別當前選擇是否為快捷項并高亮;
  • 支持國際化 $t()
  • 可自定義初始選中項;
  • 樣式美觀、可無縫集成至查詢表單。

🧱 二、組件源碼

📂 components/TimeSeparation.vue

<template>

<template><slot name="before" /><el-date-pickerclass="timeSeparationClassStart"style="width:160px"v-model="startTime"type="datetime"format="YYYY-MM-DD HH:mm:ss"value-format="YYYY-MM-DD HH:mm:ss":default-time="new Date(2000, 1, 1, 0, 0, 0)" /><span class="timeSeparationClassCenter">-</span><el-date-pickerclass="timeSeparationClassEnd"style="width:160px"v-model="endTime"type="datetime"format="YYYY-MM-DD HH:mm:ss"value-format="YYYY-MM-DD HH:mm:ss":default-time="new Date(2000, 1, 1, 23, 59, 59)" /><el-select v-model="dateRangeType" class="timeSeparationClass_after" style="width:100px" @change="changeDateRange"><el-optionv-for="dict in dateList":key="dict.value":label="$t(dict.label)":value="dict.value" /></el-select>
</template>

<script setup>

<script setup>
import { useVModel } from '@vueuse/core'
import i18n from '@/i18n'
import { parseTime } from '@/utils/ruoyi'const emit = defineEmits(['update:startTime', 'update:endTime', 'change'])const props = defineProps({startTime: String,endTime: String,defaultTime: Number, // 默認快捷選中類型showAfter: { type: Boolean, default: true }
})// 雙向綁定
const startTime = useVModel(props, 'startTime', emit)
const endTime = useVModel(props, 'endTime', emit)
const dateRangeType = ref(props.defaultTime)function changeDateRange(e) {switch (e) {case 1: setDaysAgo(7); break;case 2: setThisMonth(); break;case 4: setToday(); break;case 5: setYesterday(); break;case 6: setLastMonth(); break;}
}// 日期處理
function setDaysAgo(days) {const now = new Date();const start = new Date(now)start.setDate(start.getDate() - (days - 1))start.setHours(0, 0, 0, 0)now.setHours(23, 59, 59, 999)startTime.value = parseTime(start)endTime.value = parseTime(now)
}function setToday() {const now = new Date();const start = new Date(now)start.setHours(0, 0, 0, 0)now.setHours(23, 59, 59, 999)startTime.value = parseTime(start)endTime.value = parseTime(now)
}function setYesterday() {const start = new Date()const end = new Date()start.setDate(start.getDate() - 1)end.setDate(end.getDate() - 1)start.setHours(0, 0, 0, 0)end.setHours(23, 59, 59, 999)startTime.value = parseTime(start)endTime.value = parseTime(end)
}function setThisMonth() {const now = new Date()const start = new Date(now.getFullYear(), now.getMonth(), 1)const end = new Date(now.getFullYear(), now.getMonth() + 1, 0)end.setHours(23, 59, 59, 999)startTime.value = parseTime(start)endTime.value = parseTime(end)
}function setLastMonth() {const now = new Date()const start = new Date(now.getFullYear(), now.getMonth() - 1, 1)const end = new Date(now.getFullYear(), now.getMonth(), 0)end.setHours(23, 59, 59, 999)startTime.value = parseTime(start)endTime.value = parseTime(end)
}watch([() => startTime.value, () => endTime.value], ([newStart, newEnd]) => {const ranges = [{ num: 2, range: getTimeRange('本月') },{ num: 4, range: getTimeRange('今天') },{ num: 5, range: getTimeRange('昨天') },{ num: 6, range: getTimeRange('上月') },]const nowRange = [newStart, newEnd]const matched = ranges.find(i => JSON.stringify(i.range) === JSON.stringify(nowRange))dateRangeType.value = matched ? matched.num : undefinedemit('change')
})function getTimeRange(type) {const now = new Date()let start = new Date(), end = new Date()switch (type) {case '上月':start = new Date(now.getFullYear(), now.getMonth() - 1, 1)end = new Date(now.getFullYear(), now.getMonth(), 0)breakcase '本月':start = new Date(now.getFullYear(), now.getMonth(), 1)end = new Date(now.getFullYear(), now.getMonth() + 1, 0)breakcase '今天':start.setHours(0, 0, 0, 0)end.setHours(23, 59, 59, 999)breakcase '昨天':start.setDate(start.getDate() - 1)end.setDate(end.getDate() - 1)start.setHours(0, 0, 0, 0)end.setHours(23, 59, 59, 999)break}return [parseTime(start), parseTime(end)]
}const { t } = i18n.global
const dateList = [{ label: t('this_month'), value: 2 },{ label: t('today'), value: 4 },{ label: t('yesterday'), value: 5 },{ label: t('last_month'), value: 6 }
]
</script>

<style scoped lang="scss">

.timeSeparationClassCenter {display: flex;align-items: center;background-color: #fff;box-shadow:inset 0 1px 0 0 var(--el-input-border-color),inset 0 -1px 0 0 var(--el-input-border-color);
}.timeSeparationClassStart .el-input__wrapper {border-radius: var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow: inset 1px 0 0 0 var(--el-input-border-color);
}.timeSeparationClassEnd .el-input__wrapper {border-radius: 0;box-shadow: inset -1px 0 0 0 var(--el-input-border-color);
}.timeSeparationClass_after .el-select__wrapper {border-radius: 0 var(--el-border-radius-base) var(--el-border-radius-base) 0;background-color: var(--el-fill-color-light);
}

🚀 三、使用示例

<template><TimeSeparationv-model:startTime="queryParams.startTime"v-model:endTime="queryParams.endTime":default-time="2"@change="onDateChange"/>
</template><script setup>
import TimeSeparation from '@/components/TimeSeparation.vue'
const queryParams = reactive({startTime: '',endTime: ''
})
function onDateChange() {console.log('時間范圍變化:', queryParams)
}
</script>

📚 四、Props & Emits API 文檔

Props

參數名類型默認值說明
startTimestring''外部綁定開始時間
endTimestring''外部綁定結束時間
defaultTimenumber初始選中快捷選項(如 2:本月)
showAfterbooleantrue是否顯示快捷時間選擇

Emits

事件名參數說明
update:startTimestring綁定用 v-model:startTime
update:endTimestring綁定用 v-model:endTime
change時間范圍變更回調

🧩 五、拓展建議(可選)

拓展方向建議實現方法
動態傳入快捷項增加 shortcuts: Array prop
時間范圍校驗內置日期合法性校驗 + disabledDate
表單集成支持接入 <el-form-item> + rules
可讀性文本輸出增加 displayRange: computed 返回“xx 至 yy”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90159.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv8 模型轉換 ONNX 后 C# 調用異常:一個參數引發的跨平臺適配難題

一、問題背景&#xff1a;從 Python 訓練到 C# 部署的跨平臺需求 作為一名 C# 開發者&#xff0c;我在完成 YOLOv8 模型訓練&#xff08;使用 Ultralytics 官方框架&#xff0c;訓練數據為自定義目標檢測數據集&#xff0c;輸入尺寸 640x640&#xff0c;訓練輪次 100 輪&#…

Apache Cloudberry 亮相 2025 IvorySQL 生態大會暨 PostgreSQL 高峰論壇

6 月 27 日至 28 日&#xff0c;IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇在泉城濟南順利召開。本屆大會由 IvorySQL 開源數據庫社區主辦、瀚高基礎軟件股份有限公司承辦&#xff0c;吸引了來自國內外的數據庫技術專家、開發者與開源愛好者齊聚一堂&#xff0c;聚焦數據庫…

CMake之CMakeLists.txt語法規則

本文主要參考正點原子的應用開發手冊&#xff0c;僅作為本人學習筆記使用。 目錄 cmake 的使用方法其實還是非常簡單的&#xff0c;重點在于編寫 CMakeLists.txt&#xff0c;CMakeLists.txt 的語法規則也簡單&#xff0c;并沒有 Makefile的語法規則那么復雜難以理解&#xff01…

Mysql專題復習

重點內容&#xff1a;1. Mysql架構&#xff1a;客戶端 Server層 存儲引擎2. 索引數據結構&#xff1a;B樹4. 索引優化&#xff1a;覆蓋索引、排序、JOIN、分頁&#xff1b; COUNT; 索引下推&#xff1b;單/雙路排序5. 數據庫事務&#xff1b; 鎖&#xff1b;隔離級別&#xff…

CLIP的tokenizer詳解

一、bytes_to_unicodedef bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you wa…

【如何判斷Linux系統是Ubuntu還是CentOS】

要確定您的操作系統是 Ubuntu 還是 CentOS&#xff0c;可以通過以下方法快速檢查&#xff1a; 方法 1&#xff1a;通過終端命令&#xff08;推薦&#xff09; 在終端中執行以下命令之一&#xff1a; 查看 /etc/os-release 文件 cat /etc/os-releaseUbuntu 特征&#xff1a;顯示…

RISCV Linux 虛擬內存精講系列二 -- Linux 入口 head.S

通過 Linux 的構建系統&#xff0c;即 Linux 源代碼的根目錄下的 Makefile&#xff0c;能夠找到 vmlinux 的鏈接文件&#xff0c;從而能夠查看其入口代碼 head.S:_start&#xff0c; 如下&#xff1a; Linux 構建系統主Makefile: vmlinux.lds: head.S: 找到該入口后&#xff0c…

springAI學習:Advisors

spring AI Advisors類似于攔截器&#xff0c;會對請求的prompt做出特定的修改和增強&#xff08;比如傳入歷史溝通記錄、搜索信息等等&#xff09;&#xff0c;以達到完善prompt的目的。通過Advisors API&#xff0c;開發人員可以創建更為復雜、可重用、可維護的AI組件。下面介…

MySQL CDC與Kafka整合指南:構建實時數據管道的完整方案

一、引言&#xff1a;現代數據架構的實時化需求 在數字化轉型浪潮中&#xff0c;實時數據已成為企業的核心資產。傳統批處理ETL&#xff08;每天T1&#xff09;已無法滿足以下場景需求&#xff1a; 實時風險監控&#xff08;金融交易&#xff09;即時個性化推薦&#xff08;電商…

MATLAB | 繪圖復刻(二十一)| 扇形熱圖+小提琴圖

前段時間在小紅書刷到了一個很有特色的熱力圖&#xff0c;由大佬滾筒洗衣機創作&#xff0c;感覺很有意思&#xff0c;嘗試 MATLAB 復刻&#xff1a; 作者使用的是 python 代碼&#xff0c;趕快去瞅瞅。 復刻效果 正文部分 0.數據準備 數據需要一個用來畫熱圖的矩陣以及一個…

批量PDF轉換工具,一鍵轉換Word Excel

軟件介紹 今天為大家推薦一款高效的Office文檔批量轉換工具&#xff0c;能夠快速將Word和Excel文件批量轉換為PDF格式。 軟件特點 這款名為"五五Excel word批量轉PDF"的工具體積小巧&#xff0c;不到2M大小&#xff0c;卻能實現強大的批量轉換功能&#xff0c…

面試150 基本計算器

思路 利用棧&#xff08;stack&#xff09;來保存進入括號前的計算狀態&#xff08;包括當前計算結果和符號&#xff09;&#xff0c;以便在括號結束后正確恢復計算上下文。代碼通過遍歷字符串&#xff0c;識別數字、加號、減號和括號。遇到數字時構造完整數值&#xff1b;遇到…

源哈希(sh)解析

源哈希&#xff08;Source Hashing&#xff09;是一種負載均衡算法&#xff0c;它根據請求的源 IP 地址&#xff08;或其他標識符&#xff09;生成哈希值&#xff0c;然后根據這個哈希值將請求分配到特定的后端服務實例。這種方法常用于確保來自同一客戶端的請求始終被路由到同…

axios的使用以及封裝

前言&#xff1a; 在現代前端開發中&#xff0c;網絡請求是不可避免的核心功能之一。無論是獲取后端數據、提交表單信息&#xff0c;還是與第三方 API 交互&#xff0c;高效且可靠的 HTTP 請求庫至關重要。axios 作為一款基于 Promise 的 HTTP 客戶端&#xff0c;憑借其簡潔的 …

github上部署自己的靜態項目

前置知識1、要在github部署項目要提交打包后的靜態文件(html,css&#xff0c;js)到倉庫里2、我們看下github所提供給我們的部署方式有啥&#xff0c;如下所見&#xff1b;要么是/root文件夾&#xff08;就說倉庫里全是打包后的產物&#xff1a;html,css&#xff0c;js要全部放到…

能源管理綜合平臺——分布式能源項目一站式監控

綜合性的能源企業管理面臨著項目多、分布散、信息孤島等問題&#xff0c;分布式的多項目能源在線監控管理平臺是一種集成了多個能源項目的數據采集、監控、分析和管理的系統。平臺集成GIS能力&#xff0c;能夠展示項目的整體分布態勢&#xff0c;對不同地點、不同類型的能源項目…

修改阿里云vps為自定義用戶登錄

win系統上找到控制面板-->用戶賬戶-->更改賬戶類型點擊更改賬戶類型&#xff0c;此時我們看到vps的默認管理員賬戶Administrator。為了防止vps被別人使用默認賬戶Administrator攻擊&#xff0c;我們添加一個用戶賬戶&#xff0c;點擊添加用戶賬戶。 用戶名建議奇葩點&…

Linux: perf: debug問題一例,cpu使用率上升大約2%;多線程如何細化cpu及perf數據分析

文章目錄 前提面臨的問題內核級別函數的差別繼續debug總結根據pid前提 一個進程安置在一個CPU上,新功能上線之后,固定量的業務打起來,占用的CPU是42%。之前沒有新功能的情況下,CPU占用是40%。差了大約2%。而且這個進程里的線程數非常多,有50多個線程。從差距看變化不大,…

計算階梯電費

實現一個 Python 程序&#xff0c;根據使用的電量&#xff08;從控制臺中讓用戶輸入&#xff09;計算需要交的電費&#xff0c;電量分為兩個階梯&#xff0c;小于 200 度和大于 200 度&#xff0c;如果電量小于等于 200 度&#xff0c;電價就是 0.5 元/度&#xff0c;如果電量大…

替代MT6701,3D 霍爾磁性角度傳感器芯片

KTH5502 是一款基于垂直霍爾技術的高精度絕對角度傳感器芯片&#xff0c;支持全角度&#xff08;0–360&#xff09;測量。 芯片內部集成 X、Y 軸的垂直霍爾元件和 Z 軸的水平霍爾元件&#xff0c;能夠同時感知磁場在 X、Y、Z 三個 方向的變化。得益于垂直霍爾技術優異的正交匹…