Vue2使用v-model封装ElementUI_DatePicker 日期选择器组件

简介: 本文介绍了如何在Vue2中使用v-model封装ElementUI的DatePicker日期选择器组件,并实现自定义属性和方法的结合使用,包括禁用日期、格式化日期等功能。

日期选择器组件

核心
可以查阅这篇文章,看一些v-model的具体实现;
简介来讲,就是自定义属性和自定义方法的结合使用。
Vue2.0、Vue3.0分别使用v-model封装组件

首先新建引入element-ui组件和样式;

<!--
 * @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
      :disabled="disabled"
      :format="format"
      :value-format="valueFormat"
      class="datepicker"
      v-model="dataTime"
      @change="inputFun"
      :clearable="clearable"
      :picker-options="returnpickerOptions"
      :type="type"
      placeholder="选择日期"
      :default-time="returnDefaultTime"
    ></el-date-picker>
  </div>
</template>

<script>
export default {
   
  model: {
   
    prop: "value",
    event: "inputFun",
  },
  data() {
   
    return {
   
      dataTime: "",
      changeNum: 1,
    };
  },
  computed: {
   
    returnpickerOptions({
    pickerOptions, end, startTime }) {
   
      // 默认等于空的时候  并且是属于结束时间 并且 startTime传入了  说明 是结束时间 
      if (pickerOptions === '' && end && String(startTime)) {
   
        const timeer = startTime
        return {
   
          disabledDate(time) {
   
            return new Date(time).getTime() < new Date(timeer).getTime() || time.getTime() > Date.now();
          }
        }
      }
      // 什么也没穿
      if (pickerOptions === '') {
   
        return {
   
          disabledDate(time) {
   
            return time.getTime() > Date.now();
          }
        }
      }
      // 传入了 pickerOptions
      // console.log(this.pickerOptions, 'this.pickerOptions')
      return pickerOptions
    },
    returnDefaultTime({
    format, end }) {
   
      if (format === 'yyyy-MM-dd HH:mm:ss') {
   
        if (end) {
   
          return '23:59:59'
        } else {
   
          return '00:00:00'
        }
      } else {
   
        return ''
      }
    }
  },
  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: ""
    },
    disabled: {
   
      type: Boolean,
      require: false,
      default: false,
    },
  },
  watch: {
   
    value: {
   
      handler(e) {
   
        this.dataTime = e;
      },
      immediate: true,
    },
    dataTime: {
   
      handler(e, old) {
   
        let newV = e
        // 排除第一次加载的情况
        if (this.changeNum !== 1) {
   
          // 是结束时间并且是 yyyy-MM-dd HH:mm:ss  格式
          if (this.end && e && e !== 'null' && this.format === 'yyyy-MM-dd HH:mm:ss') {
   
            //  选择当天 time返回现在的时间
            if (this.returnTodayDate('1') === e.substr(0, 10)) {
   
              // 1、点击当天
              // 2、当天时间切换
              if (old.substr(0, 11) !== e.substr(0, 11)) {
   
                newV = this.returnTodayDate('2')
              } else {
   
                // 在新日期中切换时间
                newV = e
              }
            } else {
   
              // 有两种情况 
              // 1、直接点击的新日期
              // 2、在新日期中切换时间
              // 选择历史时间返回 23:59:59
              if (old.substr(0, 11) !== e.substr(0, 11)) {
   
                newV = e.substr(0, 11) + '23:59:59'
              } else {
   
                // 在新日期中切换时间
                newV = e
              }
            }
            this.dataTime = newV
          }
        }
        this.$emit('CallBackFun', newV)
        this.changeNum += 1
      }
    }
  },
  methods: {
   
    returnTodayDate(flag) {
   
      function add0(m) {
   
        return m < 10 ? "0" + m : String(m);
      }
      let todayDateObj = new Date();
      let dateStr = todayDateObj.getFullYear() +
        "-" +
        add0(todayDateObj.getMonth() + 1) +
        "-" +
        add0(todayDateObj.getDate())
      if (flag === '1') {
   
        return dateStr
      } else if (flag === '2') {
   
        return dateStr + " " +
          add0(todayDateObj.getHours()) +
          ":" +
          add0(todayDateObj.getMinutes()) +
          ":" +
          add0(todayDateObj.getSeconds());
      }
    },
    inputFun(e) {
   
      // 触发 v-model 的更新事件  对应  model: { prop: "value",event: "inputFun",},
      if (e === null || e === 'null') {
   
        e = ''
      }

      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;
    width: var(--el_form_width);
  }
  .datepicker {
   
    // width: 200px;
    width: var(--el_form_width);
  }
  /deep/.el-input--small .el-input__icon {
   
    line-height: 32px;
  }
}
</style>

使用:

        <div class="LongSelectWidthBox">
          <v-date-time-picker
            :format="dateTimeFormat"
            :valueFormat="dateTimeFormat"
            :type="DateTypeStr"
            title="开始时间"
            :pickerOptions="{
   
              disabledDate(time) {
   
                return time.getTime() > new Date().getTime();
              },
            }"
            v-model="startDate"
          />
          <v-date-time-picker
            end
            :format="dateTimeFormat"
            :valueFormat="dateTimeFormat"
            :startTime="startDate"
            :type="DateTypeStr"
            :pickerOptions="{
   
              disabledDate(time) {
   
                return time.getTime() > new Date().getTime();
              },
            }"
            title="结束时间"
            v-model="endDate"
          />
        </div>

  data(){
   
    return {
   
         dateTimeFormat: "yyyy-MM-dd",
            DateTypeStr: "datetime",
            endDate:"",
            startDate:""
    }
}

在这里插入图片描述

目录
相关文章
|
JavaScript
Vue2日期选择器插件(vue-datepicker-local)
这是一个基于 Vue 的日期选择器组件库,支持年份、月份、日期和时间的选择,并且均可进行范围选择。用户可以自定义日期格式与组件样式。该示例展示了如何配置组件以限制可选日期范围,并提供了相应的代码实现。
2203 0
Vue2日期选择器插件(vue-datepicker-local)
|
移动开发 Android开发 iOS开发
uniapp开发H5及app监听返回事件(以及监听不到的处理方法)
uniapp开发H5及app监听返回事件(以及监听不到的处理方法)
2534 0
element-使用el-date-picker 选择日期后返回周几(整理)
element-使用el-date-picker 选择日期后返回周几(整理)
|
前端开发 Java 程序员
el-upload上传组件accept属性限制文件类型(案例详解)
案例分享el-upload上传组件accept属性!欢迎留言沟通交流!
4238 0
el-upload上传组件accept属性限制文件类型(案例详解)
|
前端开发 IDE 编译器
HBuilderX 最新安装使用教程,附详细图解,持续更新
HBuilderX 最新安装使用教程,附详细图解,持续更新
|
5月前
|
开发工具 git 索引
如何使用Git的暂存区来管理代码更改?
如何使用Git的暂存区来管理代码更改?
978 0
|
存储 移动开发 API
如何实现浏览器内多个标签页之间的通信
在浏览器中,可通过三种方式实现多标签页通信:一是利用 `localStorage`,通过设置及监听数据变化实现信息传递;二是借助 `Broadcast Channel API`,在同一频道下双向传输消息;三是运用 `SharedWorker`,作为共享工件在各标签间架起沟通桥梁。每种方法依据实际需求选择使用。
|
JavaScript
Vue2使用v-model封装ElementUI日期组件(实现开始时间和结束时间的校验,禁选)
本文介绍了如何在Vue2中使用v-model封装ElementUI日期组件,并实现开始时间和结束时间的校验,包括禁选当前时间之后的时间。文章提供了详细的组件代码和页面使用示例,并解释了如何通过props传递参数以及如何监听和处理日期选择的变化。
505 2
|
移动开发 资源调度 JavaScript
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
这篇文章介绍了在Vue移动端网页中使用`pdfh5`和`vue-pdf`两个插件来实现PDF文件的预览,包括滚动查看、缩放、添加水印、分页加载、跳转指定页数等功能。
9049 1
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
|
前端开发 虚拟化
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得
这篇文章分享了作者使用ElementPlus的虚拟化树形控件`el-tree-v2`的心得,展示了其基本用法和如何通过自定义模板来增强树节点的交互性。
4089 1
简单记录使用 ElementPlus 的虚拟化树形控件(el-tree-v2)心得