UNPKG

jobsys-mpower

Version:

Enhanced component based on Taro & NutUI

121 lines (101 loc) 2.97 kB
import { computed, defineComponent, ref, watch } from "vue" import PickerWrapper, { pickerSlots } from "./PickerWrapper.jsx" import { DatePicker } from "vant" import { padZero } from "vant/es/utils" import { defaultFieldProps } from "../utils" /** * MpDate 日期选择 * @version 1.0.0 */ export default defineComponent({ name: "MpDate", props: { ...defaultFieldProps, modelValue: { type: Date, default: () => null }, /** * 标题 */ title: { type: String, default: "选择日期" }, }, emits: ["update:modelValue"], setup(props, { emit, slots, expose }) { const columnsType = props.defaultProps?.columnsType || ["year", "month", "day"] const prepareDate = (date) => { const value = [] if (!date) { return value } columnsType.forEach((column) => { if (column === "year") { value.push(date.getFullYear()) } else if (column === "month") { value.push(date.getMonth() + 1) } else if (column === "day") { value.push(date.getDate()) } }) return value } let defaultValue = prepareDate(props.modelValue) if (!defaultValue.length) { const now = new Date() defaultValue = [now.getFullYear(), now.getMonth() + 1, now.getDate()] } const componentValue = ref(defaultValue) watch( () => props.modelValue, () => { componentValue.value = prepareDate(props.modelValue) }, ) const pickerRef = ref(null) const displayText = computed(() => { if (props.modelValue) { let text = "" columnsType.forEach((column) => { if (column === "year") { text += `${props.modelValue.getFullYear()}/` } else if (column === "month") { text += `${padZero(props.modelValue.getMonth() + 1, 2)}/` } else if (column === "day") { text += `${padZero(props.modelValue.getDate(), 2)}` } }) return text } return "" }) expose({ displayText }) const onConfirm = ({ selectedValues }) => { pickerRef.value.close() const now = new Date() let date = {} columnsType.forEach((column, index) => { if (column === "year") { date.year = selectedValues[index] } else if (column === "month") { date.month = selectedValues[index] - 1 } else if (column === "day") { date.date = selectedValues[index] } }) emit("update:modelValue", new Date(date.year || now.getFullYear(), date.month || now.getMonth(), date.date || now.getDate())) } return () => ( <PickerWrapper ref={pickerRef} closeable={false} disabled={props.disabled || props.readonly}> {{ ...pickerSlots(slots, props), default: () => ( <DatePicker v-model={componentValue.value} onConfirm={onConfirm} onCancel={() => pickerRef.value.close()} title={props.title} {...props.defaultProps} /> ), }} </PickerWrapper> ) }, })