基于Vant UI框架实现时间段选择器

本文实例为大家分享了Vant UI框架实现时间段选择器的具体代码,供大家参考,具体内容如下

组件代码如下:

<template>

<van-picker

:title="title"

:show-toolbar="showToolbar"

:columns="columns"

@confirm="onConfirm"

@cancel="onCancel"

@change="onChange"

:confirm-button-text="confirmButtonText"

:cancel-button-text="cancelButtonText"

:loading="loading"

:readonly="readonly"

:item-height="itemHeight"

:visible-item-count="visibleItemCount"

:swipe-duration="swipeDuration"

>

<template slot="default">

<slot name="default"></slot>

</template>

<template slot="title">

<slot name="title"></slot>

</template>

<template slot="confirm">

<slot name="confirm"></slot>

</template>

<template slot="cancel">

<slot name="cancel"></slot>

</template>

<template slot="option">

<slot name="option"></slot>

</template>

<template slot="columns-top">

<slot name="columns-top"></slot>

</template>

<template slot="columns-bottom">

<slot name="columns-bottom"></slot>

</template>

</van-picker>

</template>

<script>

import Vue from 'vue'

import { Field, Picker, Popup } from 'vant';

Vue.use(Field).use(Picker).use(Popup);

export default {

name: "VanDatePicker",

props: {

value: {

type: Date,

default: () => new Date()

},

minDate: {

type: Date,

default: () => new Date(new Date().getFullYear()-5,0,1)

},

maxDate: {

type: Date,

default: () => new Date(new Date().getFullYear()+5,0,1)

},

showToolbar: {

type: Boolean,

default: () => false

},

title: {

type: String,

default: () => ''

},

confirmButtonText: {

type: String,

default: () => '确认'

},

cancelButtonText: {

type: String,

default: () => '取消'

},

loading: {

type: Boolean,

default: () => false

},

readonly: {

type: Boolean,

default: () => false

},

itemHeight: {

type: Number||String,

default: () => 44

},

visibleItemCount: {

type: Number||String,

default: () => 6

},

swipeDuration: {

type: Number||String,

default: () => 1000

},

},

data() {

return {

monthArr: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],

dayArr: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12','13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24','25', '26', '27', '28', '29', '30', '31'],

};

},

computed: {

columns: function () {

let minYear = this.minDate.getFullYear();

let maxYear = this.maxDate.getFullYear();

let year = this.value.getFullYear();

let month = this.value.getMonth();

let day = this.value.getDate();

let yearArr = [];

let i = 0;

while (i < maxYear - minYear + 1) {

yearArr.unshift((maxYear - i) + '');

i ++;

}

let columns = [

{

values: yearArr,

defaultIndex: Math.floor(year) - minYear

},

{

values: this.monthArr,

defaultIndex: Math.floor(month)

},

{

values: this.dayArr,

defaultIndex: Math.floor(day-1)

},

{

values: ['-']

},

{

values: yearArr,

defaultIndex: Math.floor(year) - minYear

},

{

values: this.monthArr,

defaultIndex: Math.floor(month)

},

{

values: this.dayArr,

defaultIndex: Math.floor(day-1)

},

];

return columns

}

},

watch: {

},

methods: {

onConfirm(value, index) {

// console.log(`当前值:${value}, 当前索引:${index}`);

this.$emit('confirm',value,index);

},

onChange(picker, value, index) {

// console.log(`当前值:${value}, 当前索引:${index}`);

let _this = this;

let minMonth = this.minDate.getMonth();

let minDay = this.minDate.getDate();

let maxMonth = this.maxDate.getMonth();

let maxDay = this.maxDate.getDate();

let d = new Date(value[0],value[1],0);

setDate(0);

setDate(4);

function setDate(i) {

//最小年份

if (value[i]-0===_this.minDate.getFullYear()) {

picker.setColumnValues(i+1,_this.monthArr.slice(minMonth));

let strMinM = '';

if (minMonth<9) {

strMinM = '0'+(minMonth+1)

} else {

strMinM = strMinM + 1 + ''

}

picker.setColumnValue(i+1,value[i+1]-1<minMonth?strMinM:value[i+1]);

if (index===i&&value[i+1]-1<minMonth) {

picker.setColumnValues(i+2,_this.dayArr.slice(minDay-1,d.getDate()));

picker.setColumnValue(i+2,value[i+2]<minDay?minDay.toString():value[i+2]);

} else {

if (value[i+1]-1===_this.minDate.getMonth()) {

picker.setColumnValues(i+2,_this.dayArr.slice(minDay-1,d.getDate()));

picker.setColumnValue(i+2,value[i+2]<minDay?minDay.toString():value[i+2]);

} else {

picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));

picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);

}

}

}

//最大年份

else if (value[i]-0===_this.maxDate.getFullYear()) {

picker.setColumnValues(i+1,_this.monthArr.slice(0,maxMonth+1));

let strManM = '';

if (maxMonth<9) {

strManM = '0'+(maxMonth+1)

} else {

strManM = maxMonth + 1 + ''

}

picker.setColumnValue(i+1,value[i+1]-1>maxMonth?strManM:value[i+1]);

if (index===i&&value[i+1]-1>maxMonth) {

picker.setColumnValues(i+2,_this.dayArr.slice(0,maxDay));

picker.setColumnValue(i+2,value[i+2]>maxDay?maxDay.toString():value[i+2]);

} else {

if (value[i+1]-1===_this.maxDate.getMonth()) {

picker.setColumnValues(i+2,_this.dayArr.slice(0,maxDay));

picker.setColumnValue(i+2,value[i+2]>maxDay?maxDay.toString():value[i+2]);

} else {

picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));

picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);

}

}

}

//其他年份

else {

picker.setColumnValues(i+1,_this.monthArr);

picker.setColumnValue(i+1,value[i+1]);

picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));

picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);

}

}

let finallyVal = picker.getValues();

let len = Math.floor(finallyVal.length/2);

//开始时间不大于结束时间

if (finallyVal.slice(0,len).join("")>finallyVal.slice(len+1).join("")){

picker.setValues([...finallyVal.slice(0,len),"-",...finallyVal.slice(0,len)]);

if (new Date(finallyVal.slice(0,len).join("-")+' 00:00:00').getTime()===this.maxDate.getTime()) {

console.log(111);

picker.setColumnValues(5,_this.monthArr.slice(0,maxMonth+1));

picker.setColumnValues(6,_this.dayArr.slice(0,maxDay));

}

}

this.$emit('change',picker,finallyVal,index);

},

onCancel() {

// console.log('取消');

this.$emit('cancel');

},

},

}

</script>

<style scoped>

</style>

调用demo

<template>

<div>

<van-field

readonly

clickable

label="时间段"

:value="value"

placeholder="选择时间段"

@click="showPicker = true"

/>

<van-popup v-model="showPicker" round position="bottom">

<van-date-picker

show-toolbar

v-model="currentDate"

title="选择时间段"

:min-date="minDate"

:max-date="maxDate"

@cancel="showPicker = false"

@confirm="onConfirm"

@change="onChange"

>

</van-date-picker>

</van-popup>

</div>

</template>

<script>

import VanDatePicker from '@/components/VanDatePicker';

export default {

name: "Test",

components: {VanDatePicker},

data() {

return {

value: '',

showPicker: false,

minDate: new Date(2010, 5, 15),

maxDate: new Date(2025, 10, 15),

currentDate: new Date(),

startDate: '',

endDate: '',

};

},

mounted() {

},

methods: {

onConfirm(value, index) {

console.log(`当前值:${value}, 当前索引:${index}`);

this.startDate = value.slice(0,3).join('-');

this.endDate = value.slice(4,7).join('-');

this.value = this.startDate + '至' + this.endDate;

this.showPicker = false

},

onChange(picker, value, index) {

console.log(`当前值:${value}, 当前索引:${index}`);

},

},

}

</script>

<style scoped>

</style>

UI示例

API:注意红色划掉的没有实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 基于Vant UI框架实现时间段选择器 的全部内容, 来源链接: utcz.com/p/238748.html

回到顶部