对Element DatePicker时间组件的封装,时间组件开始时间和结束时间绑定

背景

  1. 我们时常有时间范围选择,需要选择一个开始时间和一个结束时间给后端,但我们给后端的是两个字段, 分别是开始时间和结束时间,现在使用element绑定的值是一个数组,我们还要来回处理,很麻烦
  2. 列表也的查询,需要查询这个时间段范围内的数据, 如下,比如用户选择了,2023-7-19 至 2023-8-15,后端期望的是我们传递的开始时间是 2023-7-19 00:00:00, 结束时间:23-8-15 23:59:59,因为这样才符合这个范围的选择,8月15本就是应该包含的

在这里插入图片描述

实现

组件名: DateRangePicker

使用方法

vue3

 <DateRangePicker 
    v-model:startTime="dataForm.startTime" 
    v-model:endTime="dataForm.endTime"
   ></DateRangePicker>

vue2

 <DateRangePicker 
    :startTime.sync="dataForm.startTime" 
    :endTime.sync="dataForm.endTime"
   ></DateRangePicker>

使用双向数据绑定 startTime 绑定开始时间,endTime 绑定结束时间

代码如下

<!-- --------------------------------------
 * 日期范围选择器、让element-ui绑定的数组分别对应对到 startTime,endTime 上
 @example
  <DateRangePicker 
	  v-model:startTime="dataForm.startTime" 
	  v-model:endTime="dataForm.endTime"
	  ></DateRangePicker>
-------------------------------------- --->
<template>
  <el-date-picker
    :shortcuts="rangeShortcuts"
    v-bind="$attrs"
    v-model="date"
    :value-format="valueFormat"
    :type="type"
    @change="change"
    :start-placeholder="startPlaceholder"
    :end-placeholder="endPlaceholder"
    class="DateRangePicker"
    :range-separator="rangeSeparator"
  >
  </el-date-picker>
</template>

<script>
import dayjs from 'dayjs'
export default {
  name: "DateRangePicker",
  emits: ["update:startTime", "update:endTime", "change"],
  props: {
    type: {
      // datetimerange
      type: String,
      default: "daterange",
    },
    startTime: [Number, String, Date],
    endTime: [Number, String, Date],
    valueFormat: {
      type: String,
      default: "YYYY-MM-DD HH:mm:ss",
    },
    startPlaceholder: {
      type: String,
      default: "开始日期",
    },
    endPlaceholder: {
      type: String,
      default: "结束日期",
    },
    rangeSeparator: {
      default: "—",
    },
  },

  data() {
    return {
      rangeShortcuts,
      date: undefined,
    };
  },

  computed: {
    watchDate() {
      return [this.startTime, this.endTime]
    }
  },

  watch: {
    watchDate: "watchDateChangeHandler",
  },

  created() {
    this.watchDateChangeHandler();
  },

  methods: {
    change(val) {
      let startTime = "";
      let endTime = "";
      if (val && Array.isArray(val)) {
        startTime = val[0];
        if (this.type === 'daterange') {
          endTime = dayjs(val[1]).endOf('day').format(this.valueFormat)
        } else {
          endTime = val[1];
        }
        
        console.log(' endTime: ', endTime)
      }

      this.$emit("update:startTime", startTime);
      this.$emit("update:endTime", endTime);
      this.$emit("change", val);
    },

    watchDateChangeHandler() {
      const { startTime, endTime } = this;
      if ((startTime === 0 || startTime) && endTime) {
        this.date = [startTime, endTime];
      } else {
        this.date = undefined;
      }
    },
  },
};
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design 的时间组件可以通过设置属性 `onChange` 来实现开始时间结束时间的联动。具体实现方法如下: 1. 首先,在你的组件引入 `DatePicker` 和 `TimePicker` 组件: ```javascript import { DatePicker, TimePicker } from 'antd'; ``` 2. 在组件的 `state` 添加开始时间结束时间的初始值: ```javascript state = { startTime: null, endTime: null, }; ``` 3. 在 `DatePicker` 和 `TimePicker` 组件设置 `value` 和 `onChange` 属性: ```javascript <DatePicker showTime format="YYYY-MM-DD HH:mm:ss" value={this.state.startTime} onChange={this.handleStartTimeChange} /> <TimePicker format="HH:mm:ss" value={this.state.endTime} onChange={this.handleEndTimeChange} /> ``` 4. 编写 `handleStartTimeChange` 和 `handleEndTimeChange` 事件处理函数: ```javascript handleStartTimeChange = (value) => { if (value && this.state.endTime && value.isAfter(this.state.endTime)) { // 如果开始时间结束时间晚,则重置结束时间 this.setState({ startTime: value, endTime: null, }); } else { this.setState({ startTime: value }); } }; handleEndTimeChange = (value) => { if (value && this.state.startTime && value.isBefore(this.state.startTime)) { // 如果结束时间比开始时间早,则重置开始时间 this.setState({ startTime: null, endTime: value, }); } else { this.setState({ endTime: value }); } }; ``` 在这两个事件处理函数,我们首先判断新选择的时间是否符合逻辑,如果不符合,则重置另一个时间,并更新组件的状态。 需要注意的是,在比较时间的时候,我们使用了 `moment.js` 库的 `isAfter` 和 `isBefore` 方法。因此,在使用之前,需要先引入 `moment.js` 库: ```javascript import moment from 'moment'; import 'moment/locale/zh-cn'; moment.locale('zh-cn'); ``` 这样,就可以实现开始时间结束时间的联动了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值