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

首先看页面效果:

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

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

组件代码为:

<!--
 * @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组件

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,我无法找到关于Vue3的v-modelVue2的v-model的具体区别。引用和引用都没有提到这个问题。但是,我可以为您提供有关Vue3的v-model的一些基本信息。 在Vue3中,v-model指令的工作方式与Vue2中的v-model指令有所不同。在Vue3中,v-model指令被重构为v-model绑定和v-model事件。这种改变使得v-model指令更加灵活和可扩展。 在Vue3中,v-model绑定用于将数据绑定到组件的属性或变量。它类似于Vue2中的v-model指令,但使用了新的语法。例如,您可以使用v-model绑定将输入框的值绑定到组件的data属性: ```vue <template> <input v-model="message"> </template> <script> export default { data() { return { message: '' } } } </script> ``` 在上面的示例中,输入框的值将双向绑定到组件的message属性。 另一方面,v-model事件用于在组件内部触发更新。它类似于Vue2中的v-on指令。您可以使用v-model事件来监听输入框的值变化,并在组件内部执行相应的逻辑。例如: ```vue <template> <input :value="message" @input="updateMessage"> </template> <script> export default { data() { return { message: '' } }, methods: { updateMessage(event) { this.message = event.target.value; } } } </script> ``` 在上面的示例中,@input事件监听输入框的值变化,并调用updateMessage方法来更新组件的message属性。 总结起来,Vue3的v-model指令通过v-model绑定和v-model事件提供了更灵活和可扩展的方式来处理双向数据绑定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值