效果显示

<template>
<div>
<a-popover
placement="bottom"
overlayClassName="season-picker"
trigger="click"
v-model="showSeason"
>
<template #content>
<div class="season-picker-box">
<div class="season-picker-box_header">
<a-icon
title="前一年"
class="season-picker-box_header-left"
type="double-left"
@click="prev"
></a-icon>
<span
role="button"
class="season-picker-box_header-label"
>{{ year }}年</span
>
<a-icon
type="double-right"
title="后一年"
@click="next"
class="season-picker-box_header-right"
></a-icon>
</div>
<div class="season-picker_content">
<table class="el-month-table">
<tr>
<td>
<div>
<a
:class="{ choose: seasonValue[0] === year && seasonValue[1] === 1 }"
class="cell"
@click="selectSeason(1)"
>一季度</a
>
</div>
</td>
<td>
<div>
<a
:class="{ choose: seasonValue[0] === year && seasonValue[1] === 2 }"
class="cell"
@click="selectSeason(2)"
>二季度</a
>
</div>
</td>
</tr>
<tr>
<td>
<div>
<a
:class="{ choose: seasonValue[0] === year && seasonValue[1] === 3 }"
class="cell"
@click="selectSeason(3)"
>三季度</a
>
</div>
</td>
<td>
<div>
<a
:class="{ choose: seasonValue[0] === year && seasonValue[1] === 4 }"
class="cell"
@click="selectSeason(4)"
>四季度</a
>
</div>
</td>
</tr>
</table>
</div>
</div>
</template>
<a-input
v-model="strValue"
readOnly
/>
</a-popover>
</div>
</template>
<script>
const CNNUM = ["一", "二", "三", "四"];
const CHOOSEMONTH = [
["01", "02", "03"],
["04", "05", "06"],
["07", "08", "09"],
["10", "11", "12"],
];
export default {
name: "quarterPicker",
model: {
prop: "value",
event: "change",
},
props: {
value: {
type: Array,
default: () => [],
},
defaultValue: {
type: Array,
default: () => [],
},
},
watch: {
defaultValue: {
handler(newVal) {
if (newVal && newVal.length) {
this.dealDate(newVal);
}
},
deep: true,
immediate: true,
},
value(newVal) {
if (newVal && newVal.length) {
this.dealDate(newVal, true);
}
},
},
data() {
return {
showSeason: false,
year: new Date().getFullYear(),
strValue: "",
seasonValue: ["", ""],
};
},
methods: {
dealDate(date, isValue) {
this.year = Number(date[0].split("-")[0]);
const month = date[0].split("-")[1];
CHOOSEMONTH.forEach((item, index) => {
if (item.indexOf(month) !== -1) {
this.selectSeason(index + 1, isValue);
}
});
},
prev() {
this.year = this.year * 1 - 1;
},
next() {
this.year = this.year * 1 + 1;
},
selectSeason(i, isValue = false) {
this.strValue = `${this.year}-${CNNUM[i - 1]}季度`;
if (!isValue) {
this.$emit("change", [
`${this.year}-${CHOOSEMONTH[i - 1][0]}`,
`${this.year}-${CHOOSEMONTH[i - 1][2]}`,
]);
}
this.seasonValue = [this.year, i];
this.showSeason = false;
},
},
};
</script>
<style lang="less" scoped>
.season-picker {
margin: 0;
padding: 0;
color: #000000d9;
font-size: 14px;
.ant-popover-inner-content {
overflow: hidden;
vertical-align: top;
background: #fff;
border-radius: 2px;
box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d;
transition: margin 0.3s;
width: 200px;
color: #000000d9;
padding: 0 8px !important;
.ant-popover-arrow {
display: none !important;
}
}
&-box {
&_header {
display: flex;
height: 34px;
line-height: 28px;
color: #000000d9;
box-sizing: border-box;
border-bottom: 1px solid #f0f0f0;
justify-content: space-between;
margin-bottom: 15px;
&-left,
&-right {
line-height: 28px;
color: #00000040;
&:hover {
color: #000000d9;
}
}
}
.el-month-table {
width: 100%;
}
.el-month-table td div {
margin: 10px;
font-size: 14px;
.cell {
font-size: 12px;
color: #333333;
padding: 8px;
&:hover {
color: #40a9ff;
background: #e6f7ff;
cursor: pointer;
}
}
}
.choose {
color: #fff !important;
background: #1890ff !important;
}
}
}
</style>