vue3.x + elementPlus 封装组件之date-picker时间封装

<template>
  <div>
    <div>
      <div>
        <span>时间选择没时分秒</span>
        <LZDatePicker
          v-model="pickerData.dataTime"
          :default-time="pickerData.dataTime"
          :shortcuts="[]"
          :placeholder="pickerData.placeholder"
          @dataPickerChange="dataPickerChange"
        ></LZDatePicker>
      </div>
      <span>时间选择有时分秒</span>
      <LZDatePicker
        v-model="pickerData.dataTime2"
        :time-type="pickerData.timeType"
        :default-time="pickerData.dataTime2"
        :shortcuts="[]"
        :placeholder="pickerData.placeholder"
        @dataPickerChange="dataPickerChange2"
      ></LZDatePicker>
    </div>
    <div>
      <span>时间快捷选择</span>
      <LZDatePicker
        v-model="pickerData.dataTime3"
        :default-time="pickerData.dataTime3"
        :shortcuts="[1, 5, 10]"
        :placeholder="pickerData.placeholder"
        @dataPickerChange="dataPickerChange3"
      ></LZDatePicker>
    </div>
    <div>
      <span>时间区间选择</span>
      <LZDatePicker
        v-model="pickerData.defaultTimeDbl"
        :shortcuts-dbl="[]"
        range-separator="至"
        is-double-time
        :default-time-dbl="pickerData.defaultTimeDbl"
        @dataPickerChangeT="dataPickerChangeT"
      ></LZDatePicker>
    </div>
    <div>
      <span>时间区间选择有时分秒</span>
      <LZDatePicker
        v-model="pickerData.defaultTimeDbl2"
        :shortcuts-dbl="[]"
        :time-type-dbl="pickerData.timeTypeDbl"
        range-separator="至"
        is-double-time
        :default-time-dbl="pickerData.defaultTimeDbl2"
        @dataPickerChangeT="dataPickerChangeT"
      ></LZDatePicker>
    </div>
    <div>
      <span>时间区间快捷选择</span>
      <LZDatePicker
        v-model="pickerData.defaultTimeDbl3"
        :shortcuts-dbl="[2, 5, 10]"
        range-separator="至"
        is-double-time
        :default-time-dbl="pickerData.defaultTimeDbl3"
        @dataPickerChangeT="dataPickerChangeT"
      ></LZDatePicker>
    </div>
  </div>
</template>

<script>
import { reactive, toRefs } from 'vue'
// shortcuts  快捷时间选择 例子: :shortcuts="[1, 5, 10]"
const pickerData = reactive({
  timeType: 'datetime', // datetime/date 是否展示时分秒  单个时间展示 默认是展示年月日
  timeTypeDbl: 'datetimerange', // daterange/datetimerange 是否展示时分秒  时间区间展示 默认是展示年月日
  dataTime: '2021-01-01', // 单个时间选择 一定是string类型 只能传这个格式
  dataTime2: '2021-11-01 12:11:11', // 单个时间选择 一定是string类型 只能传这个格式
  dataTime3: '2021-11-01', // 单个时间选择 一定是string类型 只能传这个格式
  defaultTimeDbl: ['2021-01-01', '2021-02-01'],
  defaultTimeDbl2: ['2021-01-01 10:10:10', '2021-02-01 9:10:10'],
  defaultTimeDbl3: ['2021-01-01', '2021-02-01'],
  placeholder: '占位符',
})
export default {
  setup() {
    //   时间修改回调
    const dataPickerChange = (time) => {
      console.log(time)
      //   pickerData.dataTime = time
    }
    const dataPickerChange2 = (time) => {
      console.log(time)
      //   pickerData.dataTime = time
    }
    const dataPickerChange3 = (time) => {
      console.log(time)
      //   pickerData.dataTime = time
    }
    //   时间修改回调
    const dataPickerChangeT = (time) => {
      console.log(time)
    }
    return { pickerData, dataPickerChange, dataPickerChangeT, dataPickerChange2, dataPickerChange3 }
  }
}
</script>

老规矩----前面文章的步骤创建文件导入js等

1.上才艺

<template>
  <el-date-picker
    v-if="!isDoubleTime"
    :model-value="datePickerData.defaultT"
    :value-format="timeType == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'"
    :type="timeType"
    :format="timeType == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'"
    :placeholder="placeholder"
    :shortcuts="datePickerData.shortcuts"
    @change="changeData"
  >
  </el-date-picker>
  <el-date-picker
    v-else
    :model-value="datePickerData.dateTimeDbl"
    :default-value="datePickerData.dateTimeDbl"
    :value-format="timeTypeDbl == 'daterange' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'"
    :type="timeTypeDbl"
    range-separator="至"
    start-placeholder="开始日期"
    end-placeholder="结束日期"
    :shortcuts="datePickerData.shortcutsDbl"
    @change="changeData"
  >
  </el-date-picker>
</template>
<script>
import { reactive, toRefs, ref, computed } from 'vue'
const datePickerData = reactive({
  defaultT: '',
  dateTimeDbl: [], // 多个默认时间展示
  shortcuts: [], // 默认时间的处理
  shortcutsDbl: [] // 默认时间的处理
})

const initEffect = (props) => {
  const init = () => {
    // 单个时间的数据展示
    if (!props.isDoubleTime) {
      datePickerData.defaultT = props.defaultTime
      const arr = []
      if (!props.shortcuts.length) {
        datePickerData.shortcuts = arr
      } else {
        props.shortcuts.forEach((e) => {
          arr.push(
            {
              text: `前${e}天`,
              value: () => {
                const date = new Date()
                date.setTime(date.getTime() - 3600 * 1000 * 24 * e)
                return date
              }
            })
        })
        datePickerData.shortcuts = arr
      }
    } else {
      // 多个时间的快捷选择
      const arr = [new Date(), new Date()]
      if (!props.defaultTimeDbl.length) {
        datePickerData.dateTimeDbl = [new Date(), new Date()]
      }
      if (!props.shortcutsDbl.length) {
        datePickerData.shortcutsDbl = arr
      } else {
        props.shortcutsDbl.forEach((e) => {
          arr.push(
            {
              text: `前${e}天`,
              value: () => {
                const end = new Date()
                const start = new Date()
                start.setTime(start.getTime() - 3600 * 1000 * 24 * e)
                return [start, end]
              }
            })
        })
        datePickerData.shortcutsDbl = arr
      }
    }
  }
  return { init }
}
export default {
  props: {
    value: {
      default() {
        return ''
      },
      type: String
    },
    // 是否是时间组合
    isDoubleTime: {
      default() {
        return false
      },
      type: Boolean
    },
    // 单个默认时间展示
    defaultTime: {
      default() {
        return ''
      },
      type: String
    },
    // 多个默认时间展示
    defaultTimeDbl: {
      default() {
        return []
      },
      type: Array
    },
    // 时间类型  datetime  /   date   是否需要时分秒
    timeType: {
      default() {
        return 'date'
      },
      type: String
    },
    // 时间类型  datetime  /   date   是否需要时分秒
    timeTypeDbl: {
      default() {
        return 'daterange'
      },
      type: String
    },
    placeholder: {
      default() {
        return '开始时间'
      },
      type: String
    },
    // 快捷时间的展示 只用传天数  不用就传[]  空数组
    shortcuts: {
      default() {
        return []
      },
      type: Array
    },
    // 快捷时间的展示 只用传天数  不用就传[]  空数组
    shortcutsDbl: {
      default() {
        return []
      },
      type: Array
    }
  },
  emits: ['dataPickerChange', 'input'],
  setup(props, ctx) {
    const { init } = initEffect(props)
    init()
    const changeData = (val) => {
      // const time = []
      console.log(val)
      ctx.emit('dataPickerChange', val)
    }
    return { datePickerData, changeData }
  }
}
</script>

2. 使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-date-pickerElement UI库中的一个日期选择器组件,用于在网页中选择日期。它提供了丰富的配置选项和交互功能,可以满足不同场景下的日期选择需求。 封装el-date-picker的步骤如下: 1. 引入Element UI库:在项目中引入Element UI库,可以通过CDN引入或者使用npm安装。 2. 创建封装组件:在Vue组件中创建一个新的组件,可以命名为DatePicker或其他合适的名称。 3. 在组件中使用el-date-picker:在新创建的组件中使用el-date-picker组件,并根据需要配置相关属性和事件。 4. 封装组件的props:根据需要,可以在封装组件中定义props来接收父组件传递的属性值,例如设置默认日期、禁用日期等。 5. 封装组件的事件:根据需要,可以在封装组件中定义事件来向父组件传递选择的日期值或其他相关信息。 6. 样式和布局:根据项目需求,可以对封装组件进行样式和布局的调整。 以下是一个简单的封装el-date-picker的示例代码: ```vue <template> <div> <el-date-picker v-model="selectedDate" :default-value="defaultDate" :disabled-date="disabledDate" @change="handleChange" ></el-date-picker> </div> </template> <script> export default { name: 'DatePicker', props: { defaultDate: { type: Date, default: null } }, data() { return { selectedDate: null } }, methods: { handleChange(date) { this.$emit('select', date); }, disabledDate(time) { // 自定义禁用日期的逻辑 // 返回true表示禁用该日期,返回false表示可选 return time.getTime() < Date.now(); } } } </script> <style scoped> /* 样式调整 */ </style> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值