当前位置:首页 > 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 的封装示例:

<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. 支持日期范围
    修改组件逻辑,允许选择开始和结束日期。

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

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

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

    vue封装datepicker实现

注意事项

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

标签: vuedatepicker
分享给朋友:

相关文章

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project c…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现树

vue实现树

Vue 实现树形结构的方法 使用递归组件实现树形结构 递归组件是Vue中实现树形结构的常见方式。通过组件调用自身,可以轻松构建多层嵌套的树形数据。 <template> <ul…

vue实现加减

vue实现加减

Vue 实现加减功能 在 Vue 中实现加减功能可以通过数据绑定和事件监听来完成。以下是一个简单的实现方法: 模板部分 <template> <div> <…

vue实现webshell

vue实现webshell

Vue 实现 WebShell 使用 Vue 实现 WebShell 需要结合前端与后端的交互,通常通过 WebSocket 或 HTTP 协议与服务器通信。以下是一个基于 Vue 和 WebSock…

不用vue实现spa

不用vue实现spa

使用原生 JavaScript 实现 SPA 通过监听 URL 变化动态加载内容,结合 history.pushState 或 hashchange 事件实现路由切换。 // 路由配置 const…