Vue2使用v-model封装ElementUI日期组件(实现开始时间和结束时间的校验,禁选)

简介: 本文介绍了如何在Vue2中使用v-model封装ElementUI日期组件,并实现开始时间和结束时间的校验,包括禁选当前时间之后的时间。文章提供了详细的组件代码和页面使用示例,并解释了如何通过props传递参数以及如何监听和处理日期选择的变化。

首先看页面效果:

开始时间:
在这里插入图片描述

结束时间:
在这里插入图片描述
首先当前时间之后的都是禁选,结束时间只能选开始时间之后的和当前时间之前的。

组件代码为:

<!--
 * @Descripttion: 
 * @version: 
 * @Author: ZhangJunQing
 * @Date: 2022-06-08 15:55:18
 * @LastEditors: ZhangJunQing
 * @LastEditTime: 2022-08-10 17:55:23
-->
<template>
  <div class="inputBox" :style="inputBoxStyle">
    <p class="inputBoxP" :style="titleStyle" v-if="title ? true : false">
      {
   {
    title }}</p>
    <el-date-picker
      :format="format"
      :value-format="valueFormat"
      class="datepicker"
      v-model="dataTime"
      @change="inputFun"
      :clearable="clearable"
      :picker-options="returnpickerOptions"
      :type="type"
      placeholder="选择日期"
    ></el-date-picker>
  </div>
</template>

<script>
export default {
   
  model: {
   
    prop: "value",
    event: "inputFun",
  },
  data() {
   
    return {
   
      dataTime: "",
    };
  },
  computed: {
   
    returnpickerOptions() {
   
      // 默认等于空的时候  并且是属于结束时间 并且 startTime传入了  说明 是结束时间 
      if (this.pickerOptions === '' && this.end && String(this.startTime)) {
   
        const timeer = this.startTime
        return {
   
          disabledDate(time) {
   
            return new Date(time).getTime() < new Date(timeer).getTime() || time.getTime() > Date.now();
          }
        }
      }
      // 什么也没穿
      if (this.pickerOptions === '') {
   
        return {
   
          disabledDate(time) {
   
            return time.getTime() > Date.now();
          }
        }
      }
      // 传入了 pickerOptions
      console.log(this.pickerOptions, 'this.pickerOptions')
      return this.pickerOptions
    }
  },
  props: {
   
    // 是否显示取消按钮
    clearable: {
   
      type: Boolean,
      require: true
    },
    // 输入框前边的文字样式
    titleStyle: {
   
      type: String,
      require: false,
    },
    // 输入框前边的文字
    title: {
   
      type: String,
      require: false,
      // default: "请传入Titlt"
    },
    // 文字和输入框父级  可以设置样式
    inputBoxStyle: {
   
      type: String,
      require: false,
    },
    // v-model 绑定的value值 对应  model: { prop: "value",event: "inputFun",},
    value: {
   
      type: [Date, String],
      require: false,
    },
    // 输入框默认显示日期
    placeholder: {
   
      type: String,
      require: false,
      default: "请选择日期",
    },
    // 日期格式化格式
    format: {
   
      type: String,
      default: "yyyy-MM-dd HH:mm:ss",
    },
    // 返回日期格式化格式
    valueFormat: {
   
      type: String,
      default: "yyyy-MM-dd HH:mm:ss",
    },
    // 日期组件类型
    type: {
   
      type: String,
      // 可选 year/month/date/dates/ week/datetime/datetimerange/ daterange/monthrange
      default: "datetime",
    },
    // 传入 end  即代表 是结束时间不能大于当前时间  end和startTime一起使用
    end: {
   
      type: Boolean,
      default: false,
    },
    // 传入 startTime  即代表 是结束时间不能大于当前时间  end和startTime一起使用
    startTime: {
   
      type: [Date, String],
      required: false,
    },
    // 禁选日期函数 当然也还有很多属性
    pickerOptions: {
   
      type: [Object, String],
      default: ""
    },
  },
  watch: {
   
    value: {
   
      handler(newVal, oldVal) {
   
        this.dataTime = newVal;
      },
      immediate: true,
    },
  },
  methods: {
   
    inputFun(e) {
   
      // 触发 v-model 的更新事件  对应  model: { prop: "value",event: "inputFun",},
      this.$emit("inputFun", e);
    },
  },
};
</script>

<style lang="less"  scoped>
.inputBox {
   
  margin-bottom: 10px;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  width: var(--boxWidth);
  .inputBoxP {
   
    font-weight: 500;
    font-size: 12px;
    text-align: right;
    white-space: nowrap;
    width: 150px;
  }
  .inputBoxIpt {
   
    width: 200px;
  }
  .datepicker {
   
    width: 200px;
  }
  /deep/.el-input--small .el-input__icon {
   
    line-height: 28px;
  }
}
</style>

在这里插入图片描述

上面写了很多注释,不再赘述。

页面使用:

我这里是全局注册了,所以没再页面单独引入直接使用了。

 <v-date-time-picker
    format="yyyy-MM-dd"
    valueFormat="yyyy-MM-dd"
    type="date"
    title="开始时间"
    v-model="startTime"
  />
  <v-date-time-picker
    end
    :startTime="startTime"
    format="yyyy-MM-dd"
    valueFormat="yyyy-MM-dd"
    type="date"
    title="结束时间"
    v-model="endTime"
  />

当然目前在处理pickerOptions的时候如果使用了pickerOptions属性那么就是按照传入的,如果没有传入,就是默认的,就比如说是开始时间,如果end和startTime出入了,就相当于是结束时间的展示。

如果不知道v-model怎么封装可以看这篇文章:
1、Vue2.0、Vue3.0分别使用v-model封装组件[Vue必会]
还有其他两篇例子:
1、Vue2使用v-model封装ElementUI_Input组件
2、Vue2使用v-model封装ElementUI_CheckBox组件

目录
相关文章
|
前端开发 JavaScript 安全
【前端相关】elementui使用el-upload组件实现自定义上传
【前端相关】elementui使用el-upload组件实现自定义上传
3931 0
|
JavaScript
Vue2日期选择器插件(vue-datepicker-local)
这是一个基于 Vue 的日期选择器组件库,支持年份、月份、日期和时间的选择,并且均可进行范围选择。用户可以自定义日期格式与组件样式。该示例展示了如何配置组件以限制可选日期范围,并提供了相应的代码实现。
2910 0
Vue2日期选择器插件(vue-datepicker-local)
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
32049 73
|
JavaScript
vue实现多个el-form表单提交统一校验的2个方法
vue实现多个el-form表单提交统一校验的2个方法
1187 0
|
JavaScript
Vue2使用v-model封装ElementUI_CheckBox组件
本文介绍了在Vue2中如何使用v-model封装ElementUI的CheckBox组件。封装后的组件支持有标题和无标题的情况,并提供了在Vue页面中的使用示例,包括单独使用和在表单中的使用。
604 2
|
JavaScript
在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】
文章详细介绍了在Vue项目中安装和使用`vue-quill-editor`的步骤,包括如何通过npm安装、局部挂载、在Vue页面中引入和配置使用。同时,还提供了如何实现图片的缩放和拖拽功能的进阶教程,涉及到安装额外的插件`quill-image-drop-module`和`quill-image-resize-module`,以及对Webpack配置的调整。最后,文章还提供了实际效果展示和一些后续可能的拓展功能,如上传视频和将图片上传到服务器等。
在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
2468 0
|
JavaScript 索引
js数组去重的常见方法
js数组去重的常见方法
271 0

热门文章

最新文章