当前位置:首页 > 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 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue 实现协同

vue 实现协同

Vue 实现协同编辑的方案 协同编辑指多个用户同时编辑同一文档并实时同步更改。Vue 结合相关库和技术可轻松实现该功能。 使用 WebSocket 实现实时通信 WebSocket 提供全双工通信,…

vue app 实现

vue app 实现

Vue App 实现步骤 创建Vue项目 使用Vue CLI或Vite初始化项目。Vue CLI适合传统项目,Vite适合现代轻量级应用。 npm create vue@latest my-v…