惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
AWS News Blog
AWS News Blog
Google DeepMind News
Google DeepMind News
U
Unit 42
博客园 - 叶小钗
博客园 - 聂微东
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
美团技术团队
The Cloudflare Blog
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
S
Schneier on Security
C
Check Point Blog
Project Zero
Project Zero
The Hacker News
The Hacker News
Scott Helme
Scott Helme
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Cisco Talos Blog
Cisco Talos Blog
P
Privacy International News Feed
SecWiki News
SecWiki News
Latest news
Latest news
MongoDB | Blog
MongoDB | Blog
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
H
Help Net Security
TaoSecurity Blog
TaoSecurity Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Last Week in AI
Last Week in AI
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
T
The Exploit Database - CXSecurity.com
C
Cisco Blogs
PCI Perspectives
PCI Perspectives
大猫的无限游戏
大猫的无限游戏
T
Troy Hunt's Blog
H
Hacker News: Front Page
Vercel News
Vercel News

博客园 - Mc525

antv3 x6 基本语法-流程图(二) element ui el-form 表单错误 滚动可视区域 vue2 element ui el-table大数据处理无分页解决方案-分片加载 vue2 地图热力图 -下钻省市县 三级及地图资源文件 vue2 组件封装 el-select vue2 组件封装 el-input vue2 scss sass 基础安装包、安装依赖报错 !!! vue2 封装组件使用 v-mode【el-radio,el-input】 Mac Jenkins 环境部署 vue2 按钮权限(七) vue2 换肤(六) vue2 项目实例 国际化(五) vue2 项目实例 动态路由菜单(四) vue2 项目实例 Mock数据模拟(三) vue2 项目实例 Layout布局(二) vue2 项目实例 项目初始化(一) vue2 项目架构--api.js(七) vue2 项目架构--vue.config.js(七) vue2 项目架构--main.js(六)
vue2 组件封装 el-date-picker 日期
Mc525 · 2025-10-29 · via 博客园 - Mc525

基本使用都满足

包括常用的:

     时间格式 :type [date,datetime,daterange ....]

     快捷方式 :日期左侧:如 今天,昨天,一个月前日期

    日期禁用:禁用日期段

    其它相关属性

custom-date-picker 组件内容

<!--
   1、isShortcut <boolean> 是否显示快捷方式.默认 true显示 ,false 不显示
-->

<template>
  <div class="custom-date-picker">
    <el-date-picker
      v-model="dateValue"
      :type="type"
      :format="format"
      :value-format="valueFormat"
      :placeholder="placeholder"
      :disabled="disabled"
      :clearable="clearable"
      :readonly="readonly"
      :picker-options="pickerOptions"
      :range-separator="rangeSeparator"
      :start-placeholder="startPlaceholder"
      :end-placeholder="endPlaceholder"
      @change="handleChange"
      @blur="handleBlur"
      @focus="handleFocus"
    ></el-date-picker>
  </div>
</template>

<script>
export default {
  name: "CustomDatePicker",
  props: {
    // 绑定值(v-model)
    value: {
      type: [String, Number, Date, Array], // 单日期为String/Date,范围选择为Array
      default: null,
    },
    // 日期类型:date/datetime/date-range/datetime-range等
    type: {
      type: String,
      default: "date",
    },
    // style: {
    //   type: Object,
    //   default: () => {},
    // },
    // 显示格式(如 'yyyy-MM-dd')
    format: {
      type: String,
      default() {
        // 根据类型默认格式
        return this.type.includes("datetime")
          ? "yyyy-MM-dd HH:mm:ss"
          : "yyyy-MM-dd";
      },
    },
    // 绑定值格式(传给后端的格式)
    valueFormat: {
      type: String,
      default() {
        return this.type.includes("datetime")
          ? "yyyy-MM-dd HH:mm:ss"
          : "yyyy-MM-dd";
      },
    },
    // 占位符
    placeholder: {
      type: String,
      default: "请选择日期",
    },
    // 范围选择时的开始占位符
    startPlaceholder: {
      type: String,
      default: "开始日期",
    },
    // 范围选择时的结束占位符
    endPlaceholder: {
      type: String,
      default: "结束日期",
    },
    // 范围选择分隔符
    rangeSeparator: {
      type: String,
      default: "",
    },
    // 是否禁用
    disabled: {
      type: Boolean,
      default: false,
    },
    // 是否可清空
    clearable: {
      type: Boolean,
      default: true,
    },
    // 是否只读
    readonly: {
      type: Boolean,
      default: false,
    },
    // 禁用日期的回调函数(如禁用过去日期:(time) => time < Date.now() - 8.64e7)
    disabledDate: {
      type: Function,
      default: () => false, // 默认返回 false(所有日期都可选择)
    },
    // 默认显示。快捷类型 1、显示;0不显示
    isShortcut: {
      type: [String, Number, Boolean],
      default: true,
    },
    // 错误提示信息(配合表单校验)
    errorMsg: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      dateValue: this.value, // 内部绑定值
      pickerOptions: null,
      pickerOptionsDate: {
        shortcuts: [
          {
            text: "今天",
            onClick(picker) {
              picker.$emit("pick", new Date());
            },
          },
          {
            text: "一周前",
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit("pick", date);
            },
          },
          {
            text: "一个月前",
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit("pick", date);
            },
          },
        ],
        disabledDate: this.disabledDate,
        // disabledDate(time) {
        //   return time.getTime() > Date.now() - 8.64e6 // 只能选择今天及今天之前的日期
        // }
      },
      pickerOptionsRange: {
        shortcuts: [
          {
            text: "今天",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime());
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近三天",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近一周",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近一个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近三个月",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
              picker.$emit("pick", [start, end]);
            },
          },
          {
            text: "最近半年",
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 180);
              picker.$emit("pick", [start, end]);
            },
          },
        ],
        disabledDate: this.disabledDate,

        // disabledDate(time) {
        //   return time.getTime() > Date.now() - 8.64e6 // 只能选择今天及今天之前的日期
        // }
      },
    };
  },
  mounted() {
    this.initType(this.type);
  },
  // computed
  watch: {
    // 监听外部value变化,同步到内部
    value: {
      handler(val) {
        this.dateValue = val;
      },
      immediate: true,
      deep: true, // 范围选择时需要深度监听
    },
    // 内部值变化,同步到外部(v-model)
    dateValue(val) {
      this.$emit("input", val);
    },
  },
  methods: {
    initType(type) {
      // 快捷方式 true显示; false 不显示
      if (this.isShortcut) {
        if (type === "daterange") {
          this.pickerOptions = this.pickerOptionsRange;
        } else {
          this.pickerOptions = this.pickerOptionsDate;
        }
      } else {
        // 是否有禁用时间段
        if (this.disabledDate) {
          this.pickerOptions = {
            disabledDate: this.disabledDate,
          };
        } else {
          this.pickerOptions = null;
        }
      }
    },
    // 日期变化时触发
    handleChange(val) {
      this.$emit("change", val);
    },
    // 失焦事件
    handleBlur(e) {
      this.$emit("blur", e);
    },
    // 聚焦事件
    handleFocus(e) {
      this.$emit("focus", e);
    },
    // 手动清空(可外部调用)
    clear() {
      this.dateValue = null;
    },
  },
};
</script>

<style lang="scss" scoped>
.custom-date-picker {
  .el-date-editor--date {
    width: 100% !important;
  }

  .el-date-editor--daterange {
    width: 100% !important;
    padding-left: 6px;
    padding-right: 0;

    ::v-deep .el-range-separator {
      padding: 0 3px;
    }

    ::v-deep .el-range__close-icon {
      width: 20px;
    }
  }
}
</style>
import DatePickerTime from "./DatePicker/CustomDatePicker.vue";

页面调用。   date-picker-time

   <el-form-item label="时间1" prop="time1">
        <date-picker-time
          type="date"
          v-model="ruleForm.time1"
        ></date-picker-time>
      </el-form-item>

image

 如果默认不展示快捷方式  

:is-shortcut="false"
<el-form-item label="时间1" prop="time1">
        <date-picker-time
          type="date"
          :is-shortcut="false"
          v-model="ruleForm.time1"
        ></date-picker-time>
      </el-form-item>

image

禁用日期段

   <date-picker-time
          type="daterange"
          :is-shortcut="false"
          v-model="ruleForm.time1"
          :disabledDate="handleDisabledDate"
        ></date-picker-time>
      </el-form-item>
  methods: {
    handleDisabledDate(time) {
      // 禁用过去的日期
       return time.getTime() < new Date().setHours(0, 0, 0, 0);
      // 禁用未来时间
    //   return time.getTime() > new Date().setHours(0, 0, 0, 0);
    },

image

value-format="yyyy-MM-dd hh:mm:ss"

<!-- 日期时间 含有 时分秒 14位数字-->

value-format="yyyyMMddHHmmss"