当前位置:首页 > 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 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$router…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(如…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue 实现搜索

vue 实现搜索

实现 Vue 搜索功能 在 Vue 中实现搜索功能通常涉及以下几个关键步骤: 数据绑定与输入监听 使用 v-model 双向绑定搜索输入框的值,监听用户输入: <template>…

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…

vue实现循环

vue实现循环

Vue 实现循环的方法 在 Vue 中,可以通过 v-for 指令实现循环渲染列表或对象。以下是几种常见的用法: 遍历数组 使用 v-for 遍历数组时,可以同时获取当前项和索引: <ul&…