组件封装
<template>
<!-- 弹出层 -->
<van-popup v-model:show="data.isPicker" position="bottom" round @close="confirmOn">
<van-picker ref="picker" title="请选择时间" :columns="data.columns" @change="onChange" @cancel="cancelOn"
@confirm="onConfirm" v-model="data.selectedValues" />
</van-popup>
</template>
<script setup>
import { reactive, watch, getCurrentInstance } from "vue";
const customFieldName = {
text: "value",
value: "values",
children: ""
};
const data = reactive({
isPicker: false,
columns: [],
selectedValues: []
});
const props = defineProps({
showPicker: {
type: Boolean
},
values: {
type: String
}
});
const emit = defineEmits(["changeValue", "confirm"]);
watch(
() => props.showPicker,
val => {
data.isPicker = val;
data.columns = [];
getcolumns();
},
{
immediate: true
}
);
function onChange() {
}
function getcolumns() {
let strtime = props.values;
let date = new Date(strtime.replace(/-/g, "/"));
let timeVaules = date.getTime();
let dateVaules;
if (props.values != "") {
dateVaules = new Date(timeVaules);
} else {
dateVaules = new Date();
}
let Y = dateVaules.getFullYear();
let M = dateVaules.getMonth() + 1;
let D = dateVaules.getDate();
let h = dateVaules.getHours();
let m = dateVaules.getMinutes();
let s = dateVaules.getSeconds();
let year = [];
year.values = [];
let Currentday = new Date().getFullYear();
for (let i = Currentday - 10; i < Currentday + 10; i++) {
year.push({ text: i.toString(), value: i });
}
year.defaultIndex = year.values.indexOf(Y);
const _M = M < 10 ? `0${M}` : M.toString();
const _D = D < 10 ? `0${D}` : D.toString();
const _h = h < 10 ? `0${h}` : h.toString();
const _m = m < 10 ? `0${m}` : m.toString();
const _s = s < 10 ? `0${s}` : s.toString();
data.selectedValues.push(Y);
data.selectedValues.push(_M);
data.selectedValues.push(_D);
data.selectedValues.push(_h);
data.selectedValues.push(_m);
data.selectedValues.push(_s);
data.columns.push(year);
let month = [];
month = Object.keys(Array.apply(null, { length: 13 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: ''+item, value: ''+item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
month.splice(0, 1);
data.columns.push(month);
let days = getCountDays(Y, M + 1);
let day = [];
day = Object.keys(Array.apply(null, { length: days + 1 })).map(function (
item
) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: ''+item, value: ''+item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
day.splice(0, 1);
data.columns.push(day);
let hour = [];
hour = Object.keys(Array.apply(null, { length: 24 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: ''+item, value: ''+item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(hour);
let mi = [];
mi = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: ''+item, value: ''+item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(mi);
let ss = [];
ss = Object.keys(Array.apply(null, { length: 60 })).map(function (item) {
if (+item + 1 <= 10) {
return { text: "0" + item, value: "0" + item };
} else if (+item + 1 == 11) {
return { text: ''+item, value: ''+item };
} else {
return {
text: (+item + 0).toString(),
value: (+item + 0).toString()
};
}
});
data.columns.push(ss);
}
function getCountDays(year, month) {
let day = new Date(year, month, 0);
return day.getDate();
}
function confirmOn() {
emit("changeValue");
}
function cancelOn({ selectedValues }) {
confirmOn()
}
function onConfirm({ selectedValues }) {
let endval =
selectedValues[0] +
"-" +
selectedValues[1] +
"-" +
selectedValues[2] +
" " +
selectedValues[3] +
":" +
selectedValues[4] +
":" +
selectedValues[5];
confirmOn()
emit("confirm", endval);
}
</script>
组件使用
<DataTime :values="data.startTime" @changeValue="data.showStartDatePicker = false"
:showPicker="data.showStartDatePicker" @confirm="startDateOnConfirm" />
const startDateOnConfirm = (selectedValues: string) => {
data.startTime = selectedValues;
data.showStartDatePicker = false;
};
- values传入可被new Date()转换的时间,示例: 2024-09-21 14:54:48
效果展示
