使用Vue編寫一個日期選擇器
在 Vue 中實現(xiàn)日期選擇器的方法有很多,下面提供一個簡單的實現(xiàn)方法。
首先,在需要使用日期選擇器的組件中引用 Vue 和 date-fns 庫,date-fns 庫是一個輕量級的 JavaScript 時間日期工具庫,可以方便地處理日期的格式化和計算。
import Vue from 'vue'
import { format } from 'date-fns'
export default {
data () {
return {
selectedDate: null
}
},
methods: {
formatDate (date) {
return format(date, 'yyyy-MM-dd')
},
selectDate (date) {
this.selectedDate = date
}
}
}
在模板中使用第三方日期選擇器組件,這里使用了 Element UI 庫中的 DatePicker 組件。同時給 DatePicker 組件綁定 onChange 事件,將選中的日期保存到 data 中的 selectedDate 變量中。
<template>
<div>
<el-date-picker
v-model="selectedDate"
type="date"
format="yyyy-MM-dd"
@change="selectDate(selectedDate)">
</el-date-picker>
</div>
</template>
在 methods 中定義 formatDate 方法來格式化日期,并定義 selectDate 方法來處理選擇日期的操作。
import Vue from 'vue'
import { format } from 'date-fns'
export default {
data () {
return {
selectedDate: null
}
},
methods: {
formatDate (date) {
return format(date, 'yyyy-MM-dd')
},
selectDate (date) {
this.selectedDate = date
}
}
}
這樣,一個簡單的 Vue 日期選擇器就完成了,可以根據(jù)實際需要進行擴展和修改。
方法補充
除了上文的方法,小編還為大家整理了其他vue實現(xiàn)日期選擇器的方法,下面是示例代碼,希望對大家有所幫助
完整代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue 日期選擇器</title>
<style>
.datepicker {
position: relative;
display: inline-block;
}
.datepicker input {
width: 120px;
padding: 4px;
border: 1px solid #ccc;
outline: none;
cursor: pointer;
}
.datepicker-panel {
position: absolute;
top: 30px;
left: 0;
z-index: 1000;
border: 1px solid #ccc;
background-color: #fff;
box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.15);
}
.datepicker-content {
padding: 10px;
}
.datepicker-header {
margin-bottom: 10px;
text-align: center;
}
.datepicker-header span {
margin: 0 10px;
cursor: pointer;
}
.datepicker-body {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.datepicker-row {
display: flex;
}
.datepicker-cell {
width: calc(100% / 7);
text-align: center;
cursor: pointer;
}
.datepicker-cell.filled:hover {
background-color: #ddd;
}
</style>
</head>
<body>
<div id="app">
<date-picker v-model="date"></date-picker>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
Vue.component('date-picker', {
template: `
<div class="datepicker">
<input type="text" v-model="value" @click="showPicker">
<div class="datepicker-panel" v-show="visible">
<div class="datepicker-content">
<div class="datepicker-header">
<span class="datepicker-prev-year" @click="prevYear"><<</span>
<span class="datepicker-prev-month" @click="prevMonth"><</span>
<span class="datepicker-current-month">{{ currentMonth }}</span>
<span class="datepicker-next-month" @click="nextMonth">></span>
<span class="datepicker-next-year" @click="nextYear">>></span>
</div>
<div class="datepicker-body">
<div class="datepicker-row" v-for="week in weeks">
<span class="datepicker-cell"
v-for="day in week"
:class="{'filled': day !== ''}"
@click="selectDate(day)">
{{ day }}
</span>
</div>
</div>
</div>
</div>
</div>
`,
props: {
value: {
type: String,
default: ''
}
},
data() {
return {
visible: false,
year: 0,
month: 0,
day: 0
}
},
computed: {
currentMonth() {
return `${this.year} 年 ${this.month} 月`
},
weeks() {
return this.getWeeks(this.year, this.month)
}
},
methods: {
showPicker() {
this.visible = true
const date = new Date()
this.year = date.getFullYear()
this.month = date.getMonth() + 1
this.day = date.getDate()
},
prevYear() {
this.year--
},
nextYear() {
this.year++
},
prevMonth() {
if (this.month === 1) {
this.year--
this.month = 12
} else {
this.month--
}
},
nextMonth() {
if (this.month === 12) {
this.year++
this.month = 1
} else {
this.month++
}
},
getWeeks(year, month) {
const weeks = []
const firstDay = new Date(year, month - 1, 1).getDay()
const lastDay = new Date(year, month, 0).getDate()
let week = []
for (let i = 0; i < firstDay; i++) {
week.push('')
}
for (let i = 1; i <= lastDay; i++) {
week.push(i)
if ((firstDay + i) % 7 === 0) {
weeks.push(week)
week = []
}
}
if (week.length > 0) {
for (let i = 0; i < 7 - week.length; i++) {
week.push('')
}
weeks.push(week)
}
return weeks
},
selectDate(day) {
if (day) {
this.value = `${this.year}-${this.month}-${day}`
this.visible = false
}
}
}
})
new Vue({
el: '#app',
data: {
date: ''
}
})
</script>
</body>
</html>到此這篇關(guān)于使用Vue編寫一個日期選擇器的文章就介紹到這了,更多相關(guān)Vue日期選擇器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決element-ui里的下拉多選框 el-select 時,默認(rèn)值不可刪除問題
這篇文章主要介紹了解決element-ui里的下拉多選框 el-select 時,默認(rèn)值不可刪除問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
vue-router路由跳轉(zhuǎn)問題 replace
這篇文章主要介紹了vue-router路由跳轉(zhuǎn)問題 replace,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
vue相關(guān)配置文件詳解及多環(huán)境配置詳細(xì)步驟
這篇文章主要介紹了vue相關(guān)配置文件詳解及多環(huán)境配置的教程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Vue3響應(yīng)式對象Reactive和Ref的用法解讀
這篇文章主要介紹了Vue3響應(yīng)式對象Reactive和Ref的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
vue + element ui實現(xiàn)播放器功能的實例代碼
這篇文章主要介紹了vue + element ui實現(xiàn)播放器功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Vue使用vue-area-linkage實現(xiàn)地址三級聯(lián)動效果的示例
很多時候我們需要使用地址三級聯(lián)動,即省市區(qū)三級聯(lián)動,這篇文章主要介紹了Vue使用vue-area-linkage實現(xiàn)地址三級聯(lián)動效果的示例,感興趣的小伙伴們可以參考一下2018-06-06
vue3.0運行npm run dev報錯Cannot find module&
本文主要介紹了vue3.0運行npm run dev報錯Cannot find module node:url,因為使用的node版本是14.15.1低于15.0.0導(dǎo)致,具有一定的參考價值,感興趣的可以了解一下2023-10-10

