当前位置:首页 > VUE

vue封装datepicker实现

2026-01-08 15:40:45VUE

封装 Vue DatePicker 组件

封装一个 Vue DatePicker 组件可以通过以下方式实现。这里以基于第三方库(如 v-calendarelement-ui 的 DatePicker)或原生实现为例。

安装依赖(可选)

如果使用第三方库如 v-calendar,需先安装:

npm install v-calendar

基础封装示例

以下是一个基于 v-calendar 的封装示例:

vue封装datepicker实现

<template>
  <div class="custom-datepicker">
    <input
      :value="formattedDate"
      @click="isOpen = !isOpen"
      placeholder="选择日期"
      readonly
    />
    <div v-if="isOpen" class="datepicker-popup">
      <v-calendar
        :attributes="attrs"
        @dayclick="handleDateSelect"
      />
    </div>
  </div>
</template>

<script>
import { ref, computed } from 'vue';
import { setupCalendar, DatePicker } from 'v-calendar';

export default {
  name: 'CustomDatePicker',
  props: {
    modelValue: {
      type: [Date, String],
      default: null,
    },
  },
  setup(props, { emit }) {
    const selectedDate = ref(props.modelValue);
    const isOpen = ref(false);

    const formattedDate = computed(() => {
      if (!selectedDate.value) return '';
      return new Date(selectedDate.value).toLocaleDateString();
    });

    const attrs = computed(() => [
      {
        key: 'selected',
        highlight: {
          color: 'blue',
          fillMode: 'solid',
        },
        dates: selectedDate.value,
      },
    ]);

    const handleDateSelect = (date) => {
      selectedDate.value = date.date;
      emit('update:modelValue', date.date);
      isOpen.value = false;
    };

    return {
      selectedDate,
      isOpen,
      formattedDate,
      attrs,
      handleDateSelect,
    };
  },
};
</script>

<style scoped>
.custom-datepicker {
  position: relative;
  display: inline-block;
}

.datepicker-popup {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 1000;
  margin-top: 8px;
  background: white;
  border: 1px solid #ddd;
  border-radius: 4px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
</style>

使用封装好的组件

在父组件中调用:

<template>
  <div>
    <CustomDatePicker v-model="selectedDate" />
  </div>
</template>

<script>
import CustomDatePicker from './CustomDatePicker.vue';

export default {
  components: { CustomDatePicker },
  data() {
    return {
      selectedDate: null,
    };
  },
};
</script>

功能扩展

  1. 支持日期范围
    修改组件逻辑,允许选择开始和结束日期。

    vue封装datepicker实现

  2. 自定义格式
    通过 props 传入日期格式,使用 dayjsmoment 格式化。

  3. 禁用日期
    v-calendarattributes 中配置禁用日期。

  4. 国际化
    配置 v-calendarlocale 属性支持多语言。

注意事项

  • 第三方库的 DatePicker 通常提供更多功能(如时间选择、范围选择等),可直接封装其功能。
  • 原生实现的 DatePicker 需处理复杂的日期逻辑(如闰年、月份切换等),建议优先使用成熟库。
  • 样式可通过 scoped 或 CSS 变量自定义,避免全局污染。

标签: vuedatepicker
分享给朋友:

相关文章

vue实现分支

vue实现分支

Vue 实现分支的方法 在 Vue 项目中实现分支功能通常涉及条件渲染、动态组件或路由控制。以下是几种常见的实现方式: 条件渲染(v-if/v-show) 使用 Vue 的指令根据条件显示不同内容:…

vue实现全文检索

vue实现全文检索

Vue 实现全文检索的方法 客户端全文检索(适用于小型数据集) 使用 flexsearch 或 lunr.js 等轻量级库实现前端全文检索: import FlexSearch from 'flex…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

前端多线程实现vue

前端多线程实现vue

前端多线程与Vue的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker…

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…