vue - vue中对Vant日历组件(calendar)的二次封装

news2024/11/15 9:46:29

vue中对vant日历选择器组件实现的的二次封装;主要实现功能如下:

主要功能:

  1. 日期区间选择(基本);
  2. 自定义选择器的底部按钮,添加清除时间操作(slot插槽);
  3. 指定默认选中的日期范围(当前日期到本月底通过default-date)
  4. 自定义日期可选范围;(通过 min-date 和 max-date )
  5. 支持默认值的传入;(没有默认值时会显示placeholder:请选择时间区间)
  6. 自定义组件的宽度;(通过props:Width,推荐使用百分比 如:80%)

效果图如下:
请添加图片描述

日期区间组件实现如下:calendar.vue

主要代码讲解:

1, 通过<template slot="footer">可以更改底部默认的按钮,我这边添加来了一个清除时间的按钮;点击清除时间按钮会把时间清空,恢复到默认状态;
2,通过min-date 和 max-date控制日期可以选择的开始和结束的范围;
3,通过default-date可以更改指定默认选中的日期范围,需要注意的是返回的是一个数组,开始位置和结束位置;可以看一下timeInterval()方法;
4,点击确认按钮onConfirmAll()会把所选择开始日期和结束日期返回给父组件;时间格式如下:2023-02-20
5,可以传入defaultData 默认值,没有默认值会显示: 请选择时间区间
6,可以传入:Width="'100%'" 来控制组件的宽度;
7,针对不同的业务需求可以对当前组件做出相应的调整;

<template>
  <!-- 日期选择组件 可指定选择范围 -->
  <div class="calendar" :style="`width:${Width}`">
    <van-field :label="title" v-model="date" right-icon="arrow-down" readonly @click="show = true" :placeholder="placeholder" />
    <!-- 日期选择器 -->
    <van-calendar safe-area-inset-bottom v-model="show" color="#1989fa" type="range" @confirm="onConfirm" :min-date="minDate" :max-date="maxDate" :default-date="timeInterval()" ref="myCalendar">
      <template slot="footer">
        <div class="footer">
          <van-button @click="clearTimeAll" type="danger" class="footerBtn">清除时间</van-button>
          <van-button class="footerBtn" @click="onConfirmAll" type="info">确认</van-button>
        </div>
      </template>
    </van-calendar>
  </div>
</template>

<script>
export default {
  name: 'calendar',
  components: {},
  props: {
    /*  可以不用传  用来展示左侧的文案  为空则不展示文案*/
    title: {
      type: String,
      default: '',
    },
    /* 传过来的默认值 */
    defaultData: {
      type: String,
      // default:'请选择'
    },
    placeholder: {
      type: String,
      default: '请选择时间区间',
    },
    // 宽度
    Width: {
      type: String,
    },
  },
  data() {
    return {
      date: this.defaultData ? this.defaultData : '', // 先判断有没有默认值 有就用没有就为空
      show: false,
      // 日期区间
      minDate: new Date(2022, 0, 1),
      maxDate: new Date(2025, 12, 31),

      // 当前日期
      currentDate: new Date().getDate(),
    };
  },
  computed: {},
  watch: {
    // 监听到需要重新赋值
    defaultData(newValue) {
      this.date = newValue;
    },
  },
  created() {
    // 处理默认值 如果有默认值直接赋值
    if (this.defaultData) {
      this.date = this.defaultData;
    }
  },
  mounted() {},
  methods: {
    /* 日期区间 当前自动选择的日期区间 :取当天到月底   返回的是一个数组*/
    timeInterval() {
      let new_year = new Date().getFullYear();
      let new_month = new Date().getMonth() + 1;
      let new_date = new Date(new_year, new_month, 1); //取当年当月中的第一天
      let end = new Date(new_date.getTime() - 1000 * 60 * 60 * 24); //取最后一天
      return [new Date(), end];
    },

    /* 确认选择 组件自带的事件 */
    onConfirm(date) {
      const [start, end] = date;
      this.show = false;
      this.date = `${this.formatDate(start)} - ${this.formatDate(end)}`;
      // 传给父组件 以此来请求数据
      this.$emit('dateFun', `${this.formatDate(start)}`, `${this.formatDate(end)}`);
    },

    /* 确认按钮 */
    onConfirmAll() {
      // 直接调用上面的方法
      if (this.$refs.myCalendar) {
        this.$refs.myCalendar.onConfirm();
      } else {
        console.warn('myCalendar实例没有获取到');
      }
    },

    /* 清除时间 时间置空*/
    clearTimeAll() {
      this.date = '';
      this.show = false;
      this.$emit('dateFun', ``, ``);
    },
    /* 转换时间 */
    formatDate(date) {
      // 给日期补0
      return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
    },
  },
};
</script>

<style scoped lang="scss">
// 覆盖 van-field的样式
/deep/ .van-cell {
  padding: 2px 5px;
  border-radius: 5px;
  border: 1px solid #1457f0;
}
/deep/ .van-field__right-icon {
  margin-right: 0;
  padding: 0;
  color: #1457f0;
}
.footer {
  display: flex;
  justify-content: space-between;
  align-items: center;

  // 底部自定义按钮的样式
  .footerBtn {
    width: 150px;
    border-radius: 2px;
  }
}
</style>

父组件中使用:

<template>
  <div>
    <!-- 日期区间选择器演示 -->
    <h4>Vant日期区间选择器封装</h4>
    <div class="Calendar">
      <Calendar @dateFun="dateFun" :Width="'80%'" :defaultData="defaultData"></Calendar>
    </div>
  </div>
</template>

<script>
// 时间选择器
import Calendar from '../../components/calendar/calendar.vue';
export default {
//注册
  components: { Calendar },
  data() {
    return {
    	// 组件的默认值  没有可以为空 或者 组件中不在使用defaultData属性
      	defaultData:'2023-01-01-2023-02-01',
      ],
    };
  },
  methods: {
  	//接收子组件传过来的日期值 
    dateFun(start, end) {
      console.log('start:', start, 'end:', end);
      
      // 保存获取到的时间...
    },
  },
};
</script>

<style scoped lang="scss">
.Calendar {
  margin-top: 20px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种图片展示的完美方案,图片展示,object-fill

通常一般的处理 <style>.img-container {width: 300px;height: 200px;background: #f60;}img {width: 100%;height: 100%;}</style> </head> <body><div class"img-container"><img src"./行道树.png" alt""&g…

Java之JVM性能初探

一、JVM简介jvm是一种用于计算设备的规范&#xff0c;它是一个虚构出来的机器&#xff0c;是通过在实际的计算机上仿真模拟各种功能实现的。jvm包含一套字节码指令集&#xff0c;一组寄存器&#xff0c;一个栈&#xff0c;一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作…

AWS攻略——使用Public NAT解决私有子网实例访问互联网

文章目录创建NAT网关编辑Private子网路由测试知识点参考资料在《AWS攻略——子网》一文中&#xff0c;我们分别创建了一个Public子网和一个Private子网&#xff0c;并让Public子网中的实例可以SSH登录到Private子网的实例中。 现实场景中&#xff0c;我们可能存在如下需求&…

正版授权的商业级智慧校园源码 SaaS模式带小程序端

一套针对中小学校园研发的商业级智慧校园源码&#xff0c;系统功能强大&#xff0c;代码完整&#xff0c;源码有演&#xff0c;正版授权。 私信了解更多&#xff01; 一、智慧校园系统构成&#xff1a; 1、 SaaS云平台 2、 智慧校园管理平台 3、 小程序教师端 4、 小程序家…

【一文带你看懂什么是VLAN、网关、DNS和子网掩码等 】

很多小伙伴多次问到什么是VLAN、三层交换机、网关、MAC地址、DNS和子网掩码&#xff0c;它们具体的定位和用途。确实&#xff0c;如今网络技术已经覆盖了非常广阔的工作和生活场景&#xff0c;但很多人在日常的应用当中还是不太懂这些知识&#xff0c;今天我们就尝试用比较通俗…

从功能测试进阶自动化测试涨薪7k,终究是逼了自己一把...

绝大多数测试工程师都是从功能测试做起的&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好多年发现自己还只是一个功能测试工程师随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要求越…

Retrofit+Hilt后端请求小项目1--项目介绍

简介 本项目根据 youtube 对应教程实现而来 将会对对应代码以及依赖&#xff08;如 Hilt、retrofit、coil&#xff09;进行详细的分析与解读&#xff0c;同时缕清项目结构安排 如文章有叙述不清晰的&#xff0c;请直接查看原教程&#xff1a;https://www.youtube.com/watch?…

vs2019调用matlab2021混合编程

vs2019调用matlab2021 调试程序时使用vs我只能输出去看最后的结果&#xff0c;想实时的观察输出&#xff0c;老师说可以用这个办法去做 主要思想 首先&#xff1a;进行环境配置&#xff0c;主要是两个方面 1. 在VS中配置MATLAB 目录&#xff1a; &#xff08;a&#xff09…

建设 TiDB 自动化平台:转转 DBA 团队实践

转转技术 . 转转研发中心及业界小伙伴们的技术学习交流平台&#xff0c;定期分享一线的实战经验及业界前沿的技术话题。 各种干货实践&#xff0c;欢迎交流分享&#xff0c;如有问题可随时联系 waterystone ~ 莫善 转转 DBA。 负责 TiDB&#xff0c;MongoDB&#xff0c;MySQL 运…

Python调用MMDetection实现AI抠图去背景

这篇文章的内容是以 《使用MMDetection进行目标检测、实例和全景分割》 为基础&#xff0c;需要安装好 MMDetection 的运行环境&#xff0c;同时完成目标检测、实例分割和全景分割的功能实践&#xff0c;之后再看下面的内容。 想要实现AI抠图去背景的需求&#xff0c;我们需要…

linux高级命令之互斥锁

互斥锁学习目标能够知道互斥锁的作用1.互斥锁的概念互斥锁: 对共享数据进行锁定&#xff0c;保证同一时刻只能有一个线程去操作。注意:互斥锁是多个线程一起去抢&#xff0c;抢到锁的线程先执行&#xff0c;没有抢到锁的线程需要等待&#xff0c;等互斥锁使用完释放后&#xff…

2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

Java基础面试题 一、JavaWeb专题 1.HTTP响应码有哪些 1、1xx&#xff08;临时响应&#xff09; 2、2xx&#xff08;成功&#xff09; 3、3xx&#xff08;重定向&#xff09;&#xff1a;表示要完成请求需要进一步操作 4、4xx&#xff08;错误&#xff09;&#xff1a;表示请…

MySQL锁之深入死锁分析

文章目录1 死锁产生原因分析1.1 产生原因1.2 产生示例1.2.1 案例一1.2.2 案例二1.2.3 案例三1.2.4 案例四1.2.5 案例五1.2.6 案例六1.3 死锁预防策略1.4 剖析死锁的成因1.5 解除死锁的占用1.5.1 死锁分析1.5.2 死锁解决1 死锁产生原因分析 点击此处了解MySQL各种锁分析 1.1 产…

为什么计算机需要操作系统?(一文详解~)

我们从三个方面来简单聊聊为什么计算机系统操作系统这个话题。 资源分配器 如果你的CPU上只需要运行一个程序&#xff0c;那么你的确不需要操作系统。 可是&#xff0c;一旦你的CPU上需要再运行一个程序&#xff0c;那么马上就会面临一个问题&#xff1a;两个程序开始竞争资源…

山东大学教授团畅谈ChatGPT革命座谈会,探讨ChatGPT发展趋势

2月18日&#xff0c;由山东大学多院系教授学者组成的山东大学教授团在济南福瑞达自贸创新产业园举行了“畅谈ChatGPT革命”座谈会&#xff0c;诸位教授学者就ChatGPT出现的影响进行了探讨。产业园首席顾问李铁岗教授向大家介绍产业园区山东大学经济学院教授、济南福瑞达自贸创新…

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(二)

前言 资源放CSDN上面过不了审核,都快结束了都没过审真的麻了,订阅专栏的同学直接加我微信直接发你。我只打造优质专栏。专注建模四年,博主参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使…

音视频基础之音频编码原理简介

一&#xff1a;隐蔽信号 数字音频信号如果不加压缩地直接进行传送&#xff0c;将会占用极大的带宽。例如&#xff0c;一套双声道数字音频若取样频率为44.1KHz&#xff0c;每样值按16bit量化&#xff0c;则其码率为&#xff1a; 244.1kHz16bit1.411Mbit/s 如此大的带宽将给信号…

linux系统编程2--网络编程socket知识

在linux系统编程中网络编程是使用socket&#xff08;套接字&#xff09;&#xff0c;socket这个词可以表示很多概念&#xff1a;在TCP/IP协议中&#xff0c;“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程&#xff0c;“IP地址端口号”就称为socket。在TCP协议中&#…

(考研湖科大教书匠计算机网络)第五章传输层-第八节2:TCP连接管理实践部分

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 此部分为补充内容&#xff0c;主要使用Java实现TCP和UDP通信 一&#xff1a;UDP通信 &#xff08;1&#xff09;Java数据报套接字通信模型 Java UDP通信模型&#xff…

算法笔记(十)—— 哈希函数和哈希表

认识哈希函数和哈希表的实现 哈希函数 哈希函数&#xff1a;输入域无穷&#xff0c;输出域&#xff08;哈希值&#xff09;相对有限 哈希函数&#xff1a;相同的输入一定会返回相同的输出值 由于输入域的无限和输出域的有限&#xff0c;不同的输入可能会返回相同的输出&…