<template> <div class="d-form-field d-datetime-picker"> <van-field readonly :value="displayValue" :name="name" :label="label" :class="{ 'field-border': border, 'field-large': size == 'large', 'field-small': size == 'small', }" :placeholder="placeholder" right-icon="arrow" :required="_required" :disabled="disabled" :rules="rules" @click="showPicker = !disabled && true" /> <van-popup round position="bottom" v-model="showPicker"> <van-datetime-picker show-toolbar v-model="dateValue" :min-date="startDate" :title="'选择' + label" :type="type" @confirm="onConfirm" @cancel="showPicker = false" /> </van-popup> </div> </template> <script lang="ts"> import { Component, Vue, Prop, Watch } from "vue-property-decorator"; import { formUtilService } from "@/services/form-util.service"; /** * @Description 时间日期选择器 * @Author ZPFly * @Date 2021/11/3 10:19 */ @Component({ name: "DDatetimePicker", }) export default class DDatetimePicker extends Vue { @Prop({ default: "" }) value: string | undefined; // 当前选择器的值 @Prop({ default: "" }) label: string | undefined; // 输入框左侧文本 @Prop({ default: "" }) placeholder: string | undefined; // 输入框占位提示文字 @Prop({ default: "" }) name: string | undefined; // 名称,提交表单的标识符 @Prop({ default: "" }) size: string | undefined; // 大小,可选值为 large @Prop({ default: false }) disabled: boolean | undefined; //是否禁用输入框 @Prop({ default: false }) required: boolean | undefined; //是否显示表单必填星号 @Prop({ default: "date" }) type: string | undefined; //时间类型,可选值为 date time year-month month-day datehour @Prop({ default: "yyyy-MM-dd" }) format: string | undefined; // 日期格式 @Prop({ default: false }) border: false | undefined; // 显示边框 @Prop({ default: () => [] }) rules: any[] | undefined; // 校验规则 @Prop({ default: () => {return new Date(new Date().getFullYear()-10,new Date().getMonth(),new Date().getDay()) }}) startDate: Date | undefined; //初始时间 displayValue: any = ""; // 显示的日期 dateValue: any = ""; // 选中的日期 showPicker = false; // 显示选择器 // 是否必输项 get _required() { const rules = this.rules || []; let required = this.required || false; for (const item in rules) { required = required || rules[item].required; } return required; } mounted() { console.log("jtewe", this.value); const val = this.value; if (val != "") { this.displayValue = val; } this.displayValue = this.value || ""; this.dateValue = val && val != "" ? new Date(val) : new Date(); } onConfirm(value: any) { this.displayValue = formUtilService.formatDate(value); this.$emit("input", this.displayValue); console.log(this.displayValue); this.showPicker = false; } } </script> <style scoped lang="scss"> ::v-deep .van-field__label { font-size: 14px; } ::v-deep .van-cell::after { border: 0; } ::v-deep .van-field__body { padding: 4px 0 !important; } </style>