element 季度选择器组件

效果图:

回传给父组件的值:

季度选择器组件代码:

vue 复制代码
<template>
  <el-form>
    <el-form-item>
      <mark
        class="mark"
        v-show="showSeason"
        @click.stop="showSeason = false"
      ></mark>
      <el-input
        placeholder="请选择季度"
        readonly
        v-model="showValue"
        size="small"
        @focus="showSeason = true"
      >
        <i slot="prefix" class="el-input__icon el-icon-date"></i>
      </el-input>
      <el-card class="box-card" v-show="showSeason">
        <div slot="header" class="year-btn">
          <button
            type="button"
            aria-label="前一年"
            class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left"
            @click="prev"
          ></button>
          <span role="button">{{ year }}年</span>
          <button
            type="button"
            aria-label="后一年"
            @click="next"
            class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right"
          ></button>
        </div>
        <div class="season-list">
          <div
            v-for="btn in buttonList"
            :key="btn"
            :class="{ 'season-item': true, 'is-active': showValue === `${year}年第${['', '一', '二', '三', '四'][btn]}季度` }"
            @click="selectSeason(1)"
          >
          {{ `第${['', '一', '二', '三', '四'][btn]}季度` }}
          </div>
        </div>
      </el-card>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  name: 'CustomQuarterPicker',
  props: {
    defaultValue: {
      default: '', //  '2024年第二季度'
      type: String,
    },
  },

  data() {
    this.buttonList = [1, 2, 3, 4]
    return {
      showSeason: false,
      season: '',
      year: new Date().getFullYear(),
      showValue: '',
    }
  },

  created() {},
  watch: {
    defaultValue: {
      handler(value) {
        if (value) {
          this.year = value.substr(0, 4)
          this.showValue = value
        }
      },
      immediate: true,
    },
  },
  methods: {
    prev() {
      this.year = +this.year - 1
    },
    next() {
      this.year = +this.year + 1
    },
    selectSeason(num) {
      this.season = num
      this.showSeason = false
      this.showValue = `${this.year}年第${['', '一', '二', '三', '四'][num]}季度`
      this.sendMsg()
    },

    sendMsg() {
      const dateArr = [
        ['01-01', '03-31'],
        ['04-01', '06-30'],
        ['07-01', '09-30'],
        ['10-01', '12-31'],
      ]
      const result = {
        value: this.showValue,
        year: this.year,
        season: this.season,
        dateRange: [
          `${this.year}-${dateArr[this.season - 1][0]}`,
          `${this.year}-${dateArr[this.season - 1][1]}`,
        ],
        dateTimeRange: [
          `${this.year}-${dateArr[this.season - 1][0]} 00:00:00`,
          `${this.year}-${dateArr[this.season - 1][1]} 23:59:59`,
        ],
      }
      this.$emit('func', result)
    },
  },
}
</script>

<style lang="scss" scoped>
.el-form-item {
  margin-bottom: 0;
  height: 32px;
}
::v-deep .el-form-item__content {
  height: 32px;
  line-height: 32px;
}
.box-card {
  width: 322px;
  padding: 0;
  margin-top: 10px;
  position: absolute;
  z-index: 9999;
}
::v-deep .el-card__header {
  height: 30px;
  padding: 0 0 12px 0;
  box-sizing: content-box;
  margin: 12px 12px 0 12px;
}
::v-deep .el-card__body {
  padding: 10px 0;
}
.el-input {
  width: 220px !important;
  height: 32px;
}
.mark {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0);
  z-index: 999;
}

.year-btn {
  text-align: center;
  padding: 0;
}

.season-list {
  .season-item {
    display: inline-block;
    width: 50%;
    color: #606266;
    text-align: center;
    cursor: pointer;
    &:hover {
      color: #409eff;
    }
    &.is-active {
      color: #409eff;
      border-color: rgba(255, 255, 255, 0); // 隐藏边框
    }
  }
}
</style>

父组件使用案例

vue 复制代码
            <customQuarterPicker v-show="dateType === 'quarter'" @func="getMsgQuarter" :defaultValue="dateValueQuarter" />
            
		    getMsgQuarter(val) {
		      console.log('val----', val)
		      this.dateValueQuarter = val?.value || ''
		    },
相关推荐
蟾宫曲3 小时前
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
前端·npm·vue3·vite·element-plus·计时器
秋雨凉人心3 小时前
简单发布一个npm包
前端·javascript·webpack·npm·node.js
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
qq13267029403 小时前
运行Zr.Admin项目(前端)
前端·vue2·zradmin前端·zradmin vue·运行zradmin·vue2版本zradmin
LCG元4 小时前
Vue.js组件开发-使用vue-pdf显示PDF
vue.js
魏时烟4 小时前
css文字折行以及双端对齐实现方式
前端·css
哥谭居民00015 小时前
将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)
javascript·vue.js·typescript·npm·node.js·css3
烟波人长安吖~5 小时前
【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL
vue.js·pytorch·spring boot·深度学习·yolo·目标跟踪
2401_882726485 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web
web130933203985 小时前
ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含
前端·github