首页 > 其他分享 >web技术分享| 日期选择限制组件二次封装

web技术分享| 日期选择限制组件二次封装

时间:2022-11-16 11:44:54浏览次数:51  
标签:datePicker web dates 封装 startData getTime time 组件 const

vue3 + element plus 的项目

项目需求:

开始时间限制:存在某天之前的时间禁选
结束时间限制:当天之后时间禁选
开始时间与结束时间的跨度最大不超过一年
使用 element plus 的 DatePicker 日期选择器

封装结构如下

<el-date-picker
    v-model="datePicker.time"
    type="daterange"
    value-format="X"
    :default-time="datePicker.defaultime"
    format="YYYY-MM-DD"
    size="large"
    range-separator="至"
    start-placeholder="开始时间"
    end-placeholder="结束时间"
    @change="timeChange"
    :disabled-date="disabledDate"
    @calendar-change="calendarChange"
    class="date_picker_custom"
  />

vue3 + ts 的 setup 中

startDisabledTime 禁用开始时间(毫秒)
setTimeFn 设置时间,传参可参考 DatePicker 的 v-model 文档
emit("change") 事件传递给父组件获取时间区段

const prop = defineProps({
  // 禁用开始时间(毫秒)
  startDisabledTime: {
    type: Number,
    default: 0,
  },
});
const emit = defineEmits(["change"]);
const datePicker = reactive({
  time: "" as Date | number | string,
  // 记录开始时间(选择区间所需)
  startData: null as number | null,
  defaultime: [new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)],
});
// 选中日历日期后会执行的回调!!只选择一个日期就会执行,官网写的不清楚
// 主要用这个方法获取到用户选择的初始时间,然后在禁用方法里通过这个时间设置结束时间的禁用时间
const calendarChange = (dates: any) => {
  let hasSelectDate = dates !== null && dates.length > 0;
  datePicker.startData = hasSelectDate
    ? Math.floor(dates[0].getTime() / 1000)
    : null;
};
const disabledDate = (time: any) => {
  const timeRange = 1 * 24 * 60 * 60 * 1000; // 1天时间戳
  const tempTime = Date.now();
  if (datePicker.startData) {
    const sta = datePicker.startData * 1000 - timeRange * 365;
    const minTime = sta < prop.startDisabledTime ? prop.startDisabledTime : sta;
    const maxTime = datePicker.startData * 1000 + timeRange * 365;
    if (tempTime < maxTime) {
      return time.getTime() < minTime || time.getTime() > tempTime;
    }
    return time.getTime() < minTime || time.getTime() > maxTime;
  } else {
    return (
      time.getTime() >= tempTime || time.getTime() < prop.startDisabledTime
    );
  }
};
const timeChange = (dates: any) => {
  let hasSelectDate = dates !== null && dates.length > 0;
  datePicker.startData = hasSelectDate ? Number(dates[0]) : null;
  emit("change", dates);
};

// 设置日期
const setTimeFn = (time: Date | number | string) => {
  datePicker.time = time;
};
// 暴漏方法给父组件
defineExpose({ setTimeFn });

在这里插入图片描述

标签:datePicker,web,dates,封装,startData,getTime,time,组件,const
From: https://www.cnblogs.com/anyrtc/p/16895351.html

相关文章

  • C++初阶(类的访问权限以及封装+this指针+构造函数+析构函数+拷贝构造函数+参数列表+友
    面向过程与面向对象C语言是面向过程的,关注的是过程(函数),分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠......
  • 小程序封装一个Request 请求
    'usestrict'import{getToken}from'./auth'constbaseUrl1='https://xxx'.//域名地址varRequest=function(url,data,method="get",header,code=2......
  • 随记:pywebio+django报错“Failed to load resource”,cdn失效
    自己用Django+pywebio搭建的网站一直正常运转,但近期出现了报错“Failedtoloadresource”,链接显示:“http://127.0.0.1:8000/?_pywebio_cdn=False”,经查阅官网资料,应该......
  • MyEclipse技术全面解析——集成WebSphere IDE插件
    MyEclipse拥有WebSphere开发以及工程师想要和需要的额外功能,如果您的企业需要WebSphere,请使用MyEclipse作为开发的补充,这是一款多用途的WebSphereIDE,它为WebSphere开发提......
  • UI组件DevExpress ASP.NET Core v22.1亮点 - 甘特图、UI组件全新升级
    DevExpressASP.NET WebFormsControls拥有针对Web表单(包括报表)的110+种UI控件,DevExpressASP.NETMVCExtensions是服务器端MVC扩展或客户端控件,由轻量级JavaScript小部......
  • web的基本概念
    基本概念前言web开发:web,网页的意思静态webhtml,css提供给所有人看的数据始终不会发生变化!动态web提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同......
  • 面试官:你是怎样进行react组件代码复用的
    mixinMixin设计模式Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。常......
  • Selenium3自动化测试实战--第4章 WebDriver API 1
    WebDriverAPI,用来操作浏览器元素的一些类和方法。4.1从定位元素开始页面元素,都是由HTML代码组成,有层级,每个元素有不同的标签名和属性值。WebDriver提供了8种元素定位......
  • 封装,继承,多态
    super1.super调用父类的构造方法,必须在构造方法第一个2.super必须只能出现在子类的方法或构造方法中3.super和this不能同时调用构造方法Vsthis:代表......
  • 快速搭建自己的Web APP
    如何快速搭建自己WebApp?我推荐今天发现的好东西:Streamlit。这个工具几乎可以无脑创建自己想要的数据交互app,不需要前后端的细节。具体的教程我推荐王老师的如何用Pyth......