vue选择时间范围封装

根据 antd 封装时间范围选择的组件

<template>
  <view class="time-range">
    <a-form-item label="创建时间" name="startDate" class="time-select">
      <a-date-picker
        v-model:value="formData.startDate"
        valueFormat="YYYY-MM-DD"
        format="YYYY-MM-DD"
        placeholder="请选择起始日期"
        :disabled-date="disabledStartDate"
      >
        <template #suffixIcon>
          <CaretDownFilled />
        </template>
      </a-date-picker>
    </a-form-item>
    <test class="content-text">到</test>
    <a-form-item name="endDate" class="time-select">
      <a-date-picker
        v-model:value="formData.endDate"
        valueFormat="YYYY-MM-DD"
        format="YYYY-MM-DD"
        placeholder="请选择结束日期"
        :disabled-date="disabledEndDate"
      >
        <template #suffixIcon>
          <CaretDownFilled />
        </template>
      </a-date-picker>
    </a-form-item>
  </view>
</template>

<script lang="ts">
import { defineComponent, ref, watch } from 'vue'
import moment, { Moment } from 'moment'
import { CaretDownFilled } from '@ant-design/icons-vue'

export default defineComponent({
  components: { CaretDownFilled },
  props: {
    change: {
      type: Function,
      required: true,
    },
  },
  setup(props) {
    const formData = ref<any>({})

    watch(
      formData,
      (newData) => {
        props.change && props.change(newData)
      },
      { deep: true },
    )

    // 向外暴露重置表单
    const reset = () => {
      formData.value = {}
    }
    // 向外暴露设置表单数据
    const set = (params: any) => {
      formData.value = { ...params }
    }
    const disabledStartDate = (startValue: Moment) => {
      if (!startValue || !formData.value.endDate) {
        return false
      }
      const endMoment = moment(formData.value.endDate, 'YYYY-MM-DD')
      return startValue.valueOf() > endMoment.endOf('day').valueOf()
    }
    const disabledEndDate = (endValue: Moment) => {
      if (!endValue || !formData.value.startDate) {
        return false
      }
      const startMoment = moment(formData.value.startDate, 'YYYY-MM-DD')
      return endValue.valueOf() < startMoment.startOf('day').valueOf()
    }

    return {
      formData,
      reset,
      set,
      disabledStartDate,
      disabledEndDate,
    }
  },
})
</script>

<style lang="scss" scoped>
.time-range {
  display: flex;
}
.content-text {
  display: block;
  padding: 0 10px;
  line-height: 30px;
}
</style>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue2中封装一个时间选择器可以通过以下步骤进行: 1. 创建一个单文件组件(.vue文件),命名为TimePicker.vue,然后在该文件中定义你的时间选择器组件的模板、样式和逻辑。 2. 在模板中,你可以使用HTML和Vue指令来构建你的时间选择器的外观和交互。你可以使用input元素作为时间选择器的基础,并添加一些样式和事件处理程序来实现你的需求。 3. 在脚本部分,你可以使用Vue提供的data属性来定义时间选择器的数据,例如选中的时间、可选时间范围等。你还可以定义一些方法来处理时间选择器的交互逻辑,例如打开/关闭选择器、选择时间等。 4. 为了使你的时间选择器更加灵活和可配置,你可以通过props属性将一些参数传递给组件。例如,你可以传递一个可选的时间范围、默认选中的时间等。 5. 最后,你需要在父组件中使用你封装好的时间选择器组件。只需要在父组件的模板中添加一个<TimePicker></TimePicker>标签即可。你也可以通过v-model指令将选择时间绑定到父组件的数据上。 这是一个简单的示例代码,帮助你更好地理解封装过程: ``` <template> <div> <input type="text" v-model="selectedTime" @click="openPicker"> <div v-if="isOpen" class="picker"> <!-- 时间选择器的内容 --> </div> </div> </template> <script> export default { data() { return { isOpen: false, selectedTime: '', }; }, methods: { openPicker() { this.isOpen = true; }, closePicker() { this.isOpen = false; }, selectTime(time) { this.selectedTime = time; this.closePicker(); }, }, }; </script> <style scoped> .picker { /* 时间选择器的样式 */ } </style> ``` 请注意,这只是一个简单的示例,实际上你可能需要更多的代码来处理时间的格式化、校验、时间范围选择等功能。你可以根据自己的需求进行扩展和修改。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JoveTAT

感谢您的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值