VUE日期只选择日月,表格导入功能,表格下载模版功能

news2024/11/24 16:17:26

1.日期选择日月:参考https://blog.csdn.net/Oct_Somnus/article/details/129989865?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129989865-blog-116654979.235%5Ev38%5Epc_relevant_sort_base1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-129989865-blog-116654979.235%5Ev38%5Epc_relevant_sort_base1&utm_relevant_index=1

(1)在components文件夹中新建DateMonthDay文件夹

代码:(样式自己调,也就颜色改下)

<template>
    <div>
      <el-popover
        placement="bottom"
        width="280"
        v-model="visible">
        <div class="date-month-day">
          <div class="header">
            <div class="left-arrow" @click="dirClick('left')"><i class="el-icon-arrow-left" /></div>
            <div v-text="getMonthFormat" @click="monthTile" style="cursor: pointer"></div>
            <div class="right-arrow" @click="dirClick('right')"><i class="el-icon-arrow-right" /></div>
          </div>
          <div class="content" v-if="monthShow">
            <div class="month" v-for="(item) in getMonths" :key="item.key" @click="monthClick(item)"><span :class="activeMonth(item.key)">{{item.value}}</span></div>
          </div>
          <div class="content" v-else>
            <div class="day" v-for="(item) in getDays" :key="item" @click="dayClick(item)"><span :class="activeDay(item)">{{item}}</span></div>
          </div>
        </div>
        <el-input
          slot="reference"
          :placeholder="placeholder"
          prefix-icon="el-icon-date"
          :style="`cursor: pointer;width: ${width} !important;`"
          :clearable="true"
          :readonly="true"
          v-model="dateVal">
        </el-input>
      </el-popover>
    </div>
   
  </template>
   
  <script>
  import moment from 'moment' // 导入日期插件
  export default {
    name:'DateMonthDay',
    props: {
      // 默认值
      dateDefault: {
        type: String
      },
      // 居中排列
      placeholder: {
        type: String,
        default: '选择日期'
      },
      // 默认年份,闰年
      year: {
        type: String,
        default: '2020'
      },
      // 宽度
      width: {
        type: String,
        default: '150px'
      },
    },
    data() {
      return {
        visible: false,
        monthShow: false,
        monthFormat: {
          1: '一月',
          2: '二月',
          3: '三月',
          4: '四月',
          5: '五月',
          6: '六月',
          7: '七月',
          8: '八月',
          9: '九月',
          10: '十月',
          11: '十一月',
          12: '十二月',
        },
        dateVal: '',
        monthVal: '',
        dayVal: ''
      }
    },
    computed: {
      getMonthFormat() {
        return this.monthVal ? this.monthFormat[Number(this.monthVal)] : ''
      },
      // 默认选中天
      activeDay() {
        return function (item) {
          return Number(this.dayVal) == item ? 'active' : ''
        }
      },
      // 默认选中月
      activeMonth() {
        return function (item) {
          return this.monthVal == item ? 'active' : ''
        }
      },
      // 获取当前月的天数
      getDays() {
        let days = 30
        const bigMonth = [1,3,5,7,8,10,12]
        if (this.monthVal && bigMonth.includes(Number(this.monthVal))) {
          days = 31
        } else if (this.monthVal && Number(this.monthVal) == 2) {
          days = 28
          if (Number(this.year) % 4 === 0) {
            days = 29
          }
        }
        return days
      },
      // 获取月份
      getMonths() {
        let mon = []
        for(let m in this.monthFormat){
          mon.push({
            key: m < 10 ? '0' + m : '' + m,
            value: this.monthFormat[m]
          })
        }
        return mon
      }
    },
    watch: {
      dateDefault: {
        handler: function(newVal, oldVal) {
          if (newVal) {
            const defaultDate = this.year + '-' + this.dateDefault
            this.dateVal = moment(defaultDate).format('MM-DD')
            this.monthVal = moment(defaultDate).format('MM')
            this.dayVal = moment(defaultDate).format('DD')
          } else {
            // 初始化日期为当天,不需要的就置空
            // this.dateVal = moment().format('MM-DD')
            this.dateVal = ''
            this.monthVal = moment().format('MM')
            this.dayVal = moment().format('DD')
            this.$emit('update:date', this.dateVal)
            // this.$emit('update:date', '')
          }
        },
        immediate: true // immediate选项可以开启首次赋值监听
      },
      visible: {
        handler: function(newVal, oldVal) {
          if (newVal) {
            if (this.dateDefault) {
              // 按照闰年来算,防止出现29号,算到1号
              const defaultDate = this.year + '-' + this.dateDefault
              this.dateVal = moment(defaultDate).format('MM-DD')
              this.monthVal = moment(defaultDate).format('MM')
              this.dayVal = moment(defaultDate).format('DD')
            } else {
              // 初始化日期为当天,不需要的就置空
              // this.dateVal = moment().format('MM-DD')
              this.dateVal = ''
              this.monthVal = moment().format('MM')
              this.dayVal = moment().format('DD')
              this.$emit('update:date', this.dateVal)
            }
          } else {
            this.monthShow = false
          }
        },
        immediate: true // immediate选项可以开启首次赋值监听
      }
    },
    methods: {
      dirClick(type) {
        if (type == 'left') {
          if (Number(this.monthVal) == 1) {
            this.monthVal = '12'
          } else {
            this.monthVal = moment(this.monthVal).subtract(1, 'M').format('MM')
          }
        }
        if (type == 'right') {
          if (Number(this.monthVal) == 12) {
            this.monthVal = '01'
          } else {
            this.monthVal = moment(this.monthVal).add(1, 'M').format('MM')
          }
        }
   
        // 默认选中
        let month = moment().format('MM'),day = moment().format('DD')
        if (this.dateDefault) {
          month = moment(this.dateDefault).format('MM')
          day = moment(this.dateDefault).format('DD')
        }
        if (month == this.monthVal) {
          this.dayVal = Number(day)
        } else {
          this.dayVal = ''
        }
      },
      monthTile() {
        this.monthShow = true
      },
      monthClick(month) {
        this.monthVal = month.key
        this.dirClick()
        this.monthShow = false
      },
      dayClick(item) {
        this.dayVal = item
        const day = this.dayVal < 10 ? '0' + this.dayVal : '' + this.dayVal
        const val = {
          day: day,
          month: this.monthVal,
          date: this.monthVal + '-' + day,
        }
        this.$emit('update:date', val.date)
        this.$emit('changeDay', val)
        this.visible = false
      }
    }
  }
  </script>
   
  <style lang="scss" scoped>
  .date-month-day{
   
    .header{
      display: -webkit-flex; /* Safari */
      display: flex;
      text-align: center;
      flex-direction: row;
      align-items: center;
      justify-content: space-between;
      border-bottom: 1px solid #ebeef5;
      .left-arrow,.right-arrow{
        cursor: pointer;
        width: 30px;
        height: 36px;
        line-height: 36px;
        font-size: 14px;
        color: #fff;
        z-index: 9;
        // background: #fff;
      }
    }
    .content{
      display: -webkit-flex; /* Safari */
      display: flex;
      text-align: center;
      flex-direction: row;
      align-items: center;
      flex-wrap: wrap;
      margin-top: 10px;
      .day{
        width: calc(100% / 7);
        height: 36px;
        padding: 4px 0;
        box-sizing: border-box;
        text-align: center;
        cursor: pointer;
        position: relative;
        span{
          width: 24px;
          height: 24px;
          display: block;
          margin: 0 auto;
          line-height: 24px;
          position: absolute;
          left: 50%;
          transform: translateX(-50%);
          border-radius: 50%;
        }
        .active{
          color: #fff;
          background-color: #409eff;
        }
      }
      .month{
        width: calc(100% / 4);
        height: 48px;
        padding: 6px 0;
        box-sizing: border-box;
        cursor: pointer;
        span{
          width: 60px;
          height: 36px;
          display: block;
          line-height: 36px;
          color: #606266;
          margin: 0 auto;
          border-radius: 18px;
        }
        .active{
          color: #fff;
          background-color: #409eff;
        }
      }
    }
    ::v-deep{
      .el-input{
        width: 120px;
        z-index: 9;
      }
      .el-input__inner{
        cursor: pointer;
        border: none;
        text-align: center;
        padding: 0px;
        color: #42424D;
      }
    }
  }
  </style>
   

在自己的组件中引用这个子组件

结果:

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

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

相关文章

轻松使用androidstudio交叉编译libredwg库

对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…

Java 21 / JDK 21 (LTS) GA

Java 21 / JDK 21 已正式 GA&#xff0c;此版本是继 JDK 17 后的长期支持版本 (LTS)&#xff0c;Oracle 将为其提供至少八年的技术支持和更新。 本版本是Java SE平台21版的参考实现&#xff0c;由Java社区流程中的JSR 396指定。 正式稳定功能 JEP 444&#xff1a;虚拟线程JEP…

测试C#图像文本识别模块Tesseract的基本用法

微信公众号“dotNET跨平台”的文章《c#实现图片文体提取》&#xff08;参考文献3&#xff09;介绍了C#图像文本识别模块Tesseract&#xff0c;后者是tesseract-ocr&#xff08;参考文献2&#xff09; 的C#封装版本&#xff0c;目前版本为5.2&#xff0c;关于Tesseract的详细介绍…

windows上搭建llama小型私有模型

导言 llama官网是需要多读读的 openAI的付费&#xff0c;让学习LLM的成本不可控。为了省钱&#xff0c;搭建本地LLAMA模型 我的笔记本是近10年前买的配置一般的windows 目标 本地llm可以运行使用llama-cpp-python调用本地llm使用langchain/openai调用本地llm 需要重点说下&…

ESP8266 WiFi物联网智能插座—上位机和下位机通信协议

目录 1、配置节点协议 2、控制节点继电器开关协议 3、节点周期上报数据协议 4、升级节点协议 5、重启节点 本项目自定义了一套上位机和下位机通信协议&#xff0c;协议并不复杂&#xff0c;包含&#xff1a;配置节点、控制节点继电器开关、节点周期上报数据、升级节点和重启节点…

设计模式篇---桥接模式

文章目录 概念结构实例总结 概念 桥接模式&#xff1a;将抽象部分与它的实现部分解耦&#xff0c;使得两者都能够独立变化。 毛笔和蜡笔都属于画笔&#xff0c;假设需要有大、中、小三种型号的画笔&#xff0c;绘画出12种颜色&#xff0c;蜡笔需要3*1236支&#xff0c;毛笔需要…

大数据之Flume

Flume概述 一个高可用&#xff08;稳定&#xff09;&#xff0c;高可靠&#xff08;稳定&#xff09;&#xff0c;分布式的海量日志采集&#xff0c;聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。日志文件即txt文件&#xff0c;不能传输音频&#xff0c;视频&am…

【狼疮抗凝物-- 抗心磷脂抗体】

狼疮抗凝物属于易栓症的一种. 狼疮抗凝物 &#xff08;Lupus Anticoagulant LAC&#xff09;是一种作用于磷脂的IgG或IgM的抗磷脂抗体&#xff0c;在体内和体外 凝血试验中&#xff0c;磷脂对凝血酶原酶复合体活化起模板作用。狼疮抗凝物是抗磷脂的成分的抗 体&#xff0c;在多…

消息队列中,如何保证消息的顺序性?

本文选自&#xff1a;advanced-java 作者&#xff1a;yanglbme 问&#xff1a;如何保证消息的顺序性&#xff1f; 面试官心理分析 其实这个也是用 MQ 的时候必问的话题&#xff0c;第一看看你了不了解顺序这个事儿&#xff1f;第二看看你有没有办法保证消息是有顺序的&#xf…

大范围XSS扫描工具:XSS-Freak,BurpSuite随机用户代理,Hades 静态代码审核系统

大范围XSS扫描工具&#xff1a;XSS-Freak&#xff0c;BurpSuite随机用户代理&#xff0c;Hades 静态代码审核系统。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&#xff0c;支持研究学习…

华为云云耀云服务器L实例评测|centos7.9 配置python虚拟环境 运行django

文章目录 ⭐前言⭐安装python&#x1f496; wget下载&#x1f496; 选择安装位置 ⭐pip安装虚拟环境&#x1f496; pip3安装 virtualenv&#x1f496; 创建目录存放python虚拟环境 ⭐安装django&#x1f496; 指定端口运行django&#x1f496; 远程访问 ⭐总结⭐结束 ⭐前言 大…

STL函数对象和谓词

目录 函数对象 谓词 函数对象 概念: 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质: 函数对象(仿函数)是一个类&#xff0c;不是一个函数 特点: …

Linux进程创建、进程终止、进程等待、进程程序替换

目录 进程创建fork函数fork函数返回值fork创建子进程的目的之一fork调用失败的原因写实拷贝 进程终止进程执行结果进程退出码进程终止的理解进程的退出方式 进程等待进程等待的必要性进程等待的概念wait方法获取子进程status 进程程序替换替换原理替换函数函数解释命名理解单进…

深度学习自学笔记六:深层神经网络

一、深层神经网络概述 深层神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;是一种机器学习模型&#xff0c;由多个神经网络层组成。与传统的浅层神经网络相比&#xff0c;深层神经网络具有更多的隐藏层&#xff0c;使其能够进行更复杂、更抽象的特征学习…

【07】FISCOBCOS一键部署前的准备工作ubuntu安装,mysql,python,PyMySQL,java

官方文档最下面https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html JAVA已经安装好了,可以看控制台那篇文章【03】 安装mysql 下载并解压mysql sudo apt install -y mysql-server mysql-client libmysqlclient-dev安装 MySQL 服务器、MySQL 客户端和…

【C/C++笔试练习】——printf在使用%的注意事项、for循环语句的三个条件、运算符优先级、删除公共字符

文章目录 C/C笔试练习1.%符号在printf用作格式说明符的注意事项&#xff08;1&#xff09;输出%5.3s&#xff08;2&#xff09;判断%中小数点含义 2.for循环语句的三个条件&#xff08;3&#xff09;判断循环次数&#xff08;4&#xff09;判断循环次数 3.运算符优先级&#xf…

交换奇偶位:交换一个整数的二进制的奇偶位置(仅考虑正数情况)

方法二&#xff1a; 设计思想&#xff1a; 0xAAAAAAAA 的二进制表示为 10101010...&#xff08;从最低位开始&#xff09; 0x55555555 的二进制表示为 01010101...&#xff08;从最低位开始&#xff09; 问题&#xff1a;更加想不到掩码&#xff01;&#xff01;&#xf…

JVM——11.JVM小结

这篇文章我们来小结一下JVM JVM&#xff0c;即java虚拟机&#xff0c;是java代码运行时的环境。我们从底层往上层来说&#xff0c;分别是硬件部分&#xff0c;操作系统&#xff0c;JVM&#xff0c;jre&#xff0c;JDK&#xff0c;java代码。JVM是直接与操作系统打交道的。JVM也…

数据结构:二叉树的基本概念

文章目录 1. 二叉树的定义2. 二叉树的特点3. 特殊二叉树斜树满二叉树完全二叉树 4. 二叉树的性质 1. 二叉树的定义 如果我们猜一个100以内的数字,该怎么猜才能理论最快呢? 第一种方式:从1,2一直猜到100, 反正数字都是100以内,总能猜到的 第二种方式:先猜50,如果比结果小,猜75…

【WPF】填坑 - WindowChrome 自定义窗口完美实现

【WPF】填坑 - WindowChrome 自定义窗口完美实现 概述Demo 说明基本样式资源布局ShellView Style界面元素修正Command BindingCommand 实现 效果 概述 前面写过一篇关于在 WPF 中通过对 WindowChrome 的操作实现自定义窗口并保留一部分的系统功能。 【WPF】WindowChrome 自定义…