二次封装el-date-picker

根据产品需求和使用场景,将elementUi的时间选择器二次封装(将整体的时间段选择拆分成两个单独时间的选择)方便以后的维护或框架的修改。

<template>
	<div
		class="public-date"
		:style="{maxWidth:width}"
	>
		<el-date-picker
			v-model="startTime"
			v-bind="$attrs"
			class="date-custom"
			:size="size"
			:type="type"
			:picker-options="pickerOptions"
			:placeholder="startPlaceholder"
			:value-format="valueFormat"
			@change="changeDatePickerHandler"
		>
		</el-date-picker>
		<span class="mar-lr5">{{rangeSeparator}}</span>
		<el-date-picker
			v-model="endTime"
			v-bind="$attrs"
			class="date-custom"
			:size="size"
			:type="type"
			:picker-options="endTimeOption"
			:placeholder="endPlaceholder"
			:value-format="valueFormat"
			@change="changeDatePickerHandler"
		>
		</el-date-picker>
	</div>
</template>
<script>
import { utility } from "@/assets/js/common";
export default {
	inheritAttrs: false,
	name: "PublicDatePicker",
	// 参数同element ui文档一致
	// 需要改变的默认值用props,否则用attrs
	props: {
		// 绑定值(必传)
		value: {
			type: Array | String,
			required: true,
		},
		// 显示类型
		type: {
			type: String,
			default: "datetime",
		},
		// 输入框尺寸
		size: {
			type: String,
			default: "mini",
		},
		width: {
			type: String,
			default: "380px",
		},
		// 可选,绑定值的格式。不指定则绑定值为 Date 对象
		valueFormat: {
			type: String,
			// timestamp
			default: "yyyy-MM-dd HH:mm:ss",
		},
		// 日期选择器选项
		pickerOptions: {
			type: Object,
			default: () => {
				return {};
			},
		},
		// 选择范围时的分隔符
		rangeSeparator: {
			type: String,
			default: "~",
		},
		// 范围选择时开始日期的占位内容
		startPlaceholder: {
			type: String,
			default: "选择开始时间",
		},
		// 范围选择时结束日期的占位内容
		endPlaceholder: {
			type: String,
			default: "选择结束时间",
		},
	},
	data() {
		return {
			startTime: "",
			endTime: "",
			endTimeOption: {},
			disabledDate: null,
		};
	},
	watch: {
		value: {
			handler(nVal) {
				if (Array.isArray(nVal) && nVal.length) {
					this.startTime = nVal[0] || "";
					this.endTime = nVal[1] || "";
				} else {
					// 数据格式去重置
					this.emitEventHandler();
				}
			},
			immediate: true,
		},
	},
	created() {
		// 获取时间限制函数
		// 深拷贝方法utility.deepClone
		this.endTimeOption = utility.deepClone(this.pickerOptions);
		if (this.pickerOptions.disabledDate) {
			this.disabledDate = utility.deepClone(
				this.pickerOptions.disabledDate
			);
		}

		// 对结束时间增加限制
		this.endTimeOption.disabledDate = (time) => {
			let flag = false;
			if (this.startTime) {
				if (
					new Date(this.startTime).getTime() - 24 * 3600 * 1000 + 1 >
					time.getTime()
				) {
					return true;
				}
			}
			// props传入限制
			if (
				Object.prototype.toString.call(this.disabledDate) ==
				"[object Function]"
			) {
				flag = flag || this.disabledDate(time);
			}
			return flag;
		};
	},
	methods: {
		changeDatePickerHandler() {
			// 开始时间大于结束时间
			if (
				new Date(this.startTime).getTime() >
					new Date(this.endTime).getTime() &&
				new Date(this.endTime).getTime() != 0
			) {
				this.endTime = "";
				this.$message({
					message: `开始时间不能大于结束时间`,
					type: "error",
				});
				return;
			}
			this.emitEventHandler(this.startTime, this.endTime);
		},
		
		emitEventHandler(startTime, endTime) {
			let value = [startTime || "", endTime || ""];
			this.$emit("update:value", value);
			this.$emit("input", value);
			this.$emit("change", value);
		},
	},
};
</script>
<style lang="scss" scoped>
.public-date{
	width: 100%;
	display: flex;
	flex-wrap: nowrap;
	align-items: center;
	.date-custom {
		/deep/ .el-input__suffix {
			right: 0;
		}
		/deep/ .el-icon-time {
			display: none;
		}
		/deep/ .el-icon-date {
			display: none;
		}
		/deep/ .el-input__inner {
			padding: 0 15px !important;
		}
		/deep/.el-input__icon {
			line-height: 32px;
		}
	}
	.mar-lr5 {
		margin: 0 3px;
	}
}
</style>

封装的组件是根据产品需求走的,可以自行修改。
换成这种选择器可以只选择开始或结束时间进行查询。但有些场景需要两个时间都选择,可自行编写自定义校验规则。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-date-pickerElement UI库中的一个日期选择器组件,用于在网页中选择日期。它提供了丰富的配置选项和交互功能,可以满足不同场景下的日期选择需求。 封装el-date-picker的步骤如下: 1. 引入Element UI库:在项目中引入Element UI库,可以通过CDN引入或者使用npm安装。 2. 创建封装组件:在Vue组件中创建一个新的组件,可以命名为DatePicker或其他合适的名称。 3. 在组件中使用el-date-picker:在新创建的组件中使用el-date-picker组件,并根据需要配置相关属性和事件。 4. 封装组件的props:根据需要,可以在封装组件中定义props来接收父组件传递的属性值,例如设置默认日期、禁用日期等。 5. 封装组件的事件:根据需要,可以在封装组件中定义事件来向父组件传递选择的日期值或其他相关信息。 6. 样式和布局:根据项目需求,可以对封装组件进行样式和布局的调整。 以下是一个简单的封装el-date-picker的示例代码: ```vue <template> <div> <el-date-picker v-model="selectedDate" :default-value="defaultDate" :disabled-date="disabledDate" @change="handleChange" ></el-date-picker> </div> </template> <script> export default { name: 'DatePicker', props: { defaultDate: { type: Date, default: null } }, data() { return { selectedDate: null } }, methods: { handleChange(date) { this.$emit('select', date); }, disabledDate(time) { // 自定义禁用日期的逻辑 // 返回true表示禁用该日期,返回false表示可选 return time.getTime() < Date.now(); } } } </script> <style scoped> /* 样式调整 */ </style> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值