vue3封装年份组件

ant框架年份组件
看了ant框架针对于年份不能自定义插槽内容所以放弃用ant框架年份组件,自定义插槽内容是想实现年份下方可以加小圆点的需求,因加小圆点需求必须实现,决定自己封装组件来实现需求,自己实现的效果呢类似于ant年份控件 在这里做一下记录。
效果图如下:
在这里插入图片描述
1.YearPicker.vue

<template><div class="year-picker" ><q-inputoutlinedv-model="contentValue"dense@blur="blurEvent"@focus="inputFocus"placeholder="选择年份"clearable@clear="clearHandle"class="col"></q-input><transition name="fade"><div class="year-picker__year-box" v-if="showYearContent"><div class="year-picker__year-title"><span class="to-left" @click="toLeft()"><DoubleLeftOutlined style="rgba(0, 0, 0, 0.45)"/></span><span class="to-middle">{{yearStart}}-{{yearEnd-1}}</span><span class="to-right" @click="toRight()"><DoubleRightOutlined style="rgba(0, 0, 0, 0.45)"/></span></div><div class="year-picker__year-content" ><span v-for="(item,index) in yearList" :key="index" style="position: relative;"><div  class="listItem" :class="{listItemBgC: item === checkedIndex,'year-disable':yearDis(item)}" @click="chooseYear(item,index)">{{item}}</div><div :class="getAllYear(item)" ></div></span></div></div></transition></div>
</template>
<script>
import { ref, shallowRef, watch, nextTick, onMounted, inject,reactive ,computed,toRefs,getCurrentInstance,watchEffect} from 'vue'
import {DoubleLeftOutlined,DoubleRightOutlined} from '@ant-design/icons-vue'
export default {name: 'index',components:{DoubleLeftOutlined,DoubleRightOutlined},props: {yearDisable: {type: String,default: 'no'},contentValue: {type: Number,},allDataList:{type: Array,default: ()=>{return []}},},setup(props,context) {const { yearDisable } = toRefs(props);const checkedIndex = ref()const state = reactive({yearLists: [],showYearContent: false,yearStart: 2010,yearEnd: 2030,blurIndex:null,allDataList:[],})const contentValue = ref()watch(() => props.contentValue, (newvalue) => {if(newvalue){contentValue.value = newvaluecontext.emit('handlerInput',newvalue)}}, {immediate: true})watch(() => props.allDataList, (value) => {if(!value) returnstate.allDataList = value}, {immediate: true})const inputFocus = ()=> {state.showYearContent = true}const blurEvent= (e)=> {state.showYearContent = false}const chooseYear=(year,index)=> {if (year > yearDis.value) returnstate.showYearContent = falsecheckedIndex.value = yearcontext.emit('handlerInput', year)}const toLeft=()=> {state.yearStart -= 20state.yearEnd -= 20state.showYearContent = true}const toRight=()=> {state.yearStart += 20state.yearEnd += 20state.showYearContent = true}const yearDis = computed(()=>{return function (y) {switch (yearDisable.value) {case 'before': {return y < new Date().getFullYear()}break;case 'no': {return false}break;case 'after': {return y > new Date().getFullYear()}}}})const yearList = computed(()=>{let arr = []for (let i = state.yearStart; i < state.yearEnd; i++) {arr.push(i)}return arr})const clearHandle = (value)=>{checkedIndex.value = ''}//实现年份下方加小圆点事件const getAllYear = (year) => {if(state.allDataList.findIndex(mon =>  mon === year) !== -1){return 'checkbox1'}else{return 'defultbox1'}}return {...toRefs(state),yearDis,getAllYear,yearList,checkedIndex,clearHandle,inputFocus,contentValue,blurEvent,chooseYear,toLeft,toRight,}},
}
</script><style scoped lang="scss">
.checkbox1{position: absolute;left: 50%;height: 5px;width: 8px;border-radius: 5px;background-color: #ff9800;transform: translate3d(-50%,0,0)
}
.defultbox1{position: absolute;left: 50%;height: 5px;width: 8px;border-radius: 5px;
}
.year-picker {::v-deep(.q-field--dense .q-field__control){height: 32px!important;}::v-deep(.q-field--dense .q-field__marginal){height: 32px!important;}.col{box-sizing: border-box;margin: 0;color: rgba(0, 0, 0, 0.88);font-size: 14px;height: 32px!important;position: relative;display: inline-flex;align-items: center;background: #ffffff;border-radius: 6px;transition: border 0.2s,box-shadow;}.col:hover{border: none!important;margin: 0;}margin-left: 20px;display: inline-block;border-radius: 5px;.year-picker__icon {position: absolute;transform: translate(-26px, 10px);color: #d9d9d9}.year-picker__input--real:hover {border: 1px solid rgba(0, 122, 244, 0.8);}.year-picker__year-title {height: 40px;width: 270px;border-top: 1px solid #d4d4d4;border-bottom: 1px solid #d4d4d4;display: flex;justify-content: space-around;align-items: center;.to-middle{font-weight: bold;color: #666666;}span {color: #525252;cursor: pointer;}span:active {opacity: .5;}}.year-picker__year-box {position: absolute;z-index: 10;background: #ffffff;border-radius: 5px;border: 1px solid #eeeeee;box-shadow: 0 0 .38rem 0 rgba(0, 0, 0, 0.1);transform: translateY(-32px);left:36px;top:72px;}.year-picker__year-content {padding-top: 20px;width: 270px;height: 250px;display: flex;flex-wrap: wrap;justify-content: space-around;.listItem{color: #525252;font-size: 14px;width: 48px;height: 25px;display: flex;justify-content: center;align-items: center;margin-bottom: 2px;}.listItem:hover{cursor: pointer;}.listItemBgC{background-color: #0067c0;color:white;border-radius: 3px;}.year-disable {background: #f5f5f5;}.year-disable:hover {cursor: no-drop;background: #f5f5f5;}}
}
.fade-enter,
.fade-leave-to {opacity: 0;transform: translateY(-30px);
}
/* 过程 */
.fade-enter-active {transition: all 0.5s;
}
/* 结束 */
.fade-enter-to {opacity: 1;
}
.fade-leave-active {transition: all 0.5s;
}.dark {border: 1px solid blue;color: #8099b3;.year-picker__input {background: #003366;color: #8099b3;;}.year-picker__input--real {border: 1px solid blue;height: 32px;}.year-picker__input::placeholder {color: #1c5389;}.year-picker__year-title {border-top: 1px solid blue;border-bottom: 1px solid blue;span {color: #8099b3;}}.year-text:hover {cursor: pointer;background: rgba(157, 219, 252, 0.41);border-radius: 3px;}.year-picker__year-content {.year-text {color: #8099b3;}.year-disable {background: #133558;}.year-disable:hover {cursor: no-drop;background: #133558;}}
}
</style>

vue 使用组件

 <YearPicker :contentValue="contentValue" @handlerInput="handlerInput" :year-disable="'no'" :allDataList="allDataList"/>
 const state =  reactive({contentValue:'', //选中的年份allDataList:[2018,2019],// 加这个属性呢是实现年份下方加黄色小圆点})//组件里选中的年份传过来的事件const handlerInput =  (value) =>{console.log(value)state.contentValue = value}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数论】约数

试除法求约数 时间复杂度 O(sqrt(n))。 核心思路是求到较小的约数时&#xff0c;将其对应的较大约数也可以直接求出来&#xff0c; 例如&#xff1a;a/bc&#xff0c;b是a的余数&#xff0c;c也是a的余数 ps&#xff1a;注意bc的情况&#xff0c;要注意去重 void solve() …

数据库客户案例:每个物种都需要一个数据库!

1、GERDH——花卉多组学数据库 项目名称&#xff1a;GERDH&#xff1a;花卉多组学数据库 链接地址&#xff1a;https://dphdatabase.com 项目描述&#xff1a;GERDH包含了来自150多种园艺花卉植物种质的 12961个观赏植物。将不同花卉植物转录组学、表观组学等数据进行比较&am…

水利水库大坝安全监测参数详解

变形监测 变形监测是指对工程结构或地质环境中的变形进行实时或定期的测量与监测的过程。变形监测的目的是为了及时了解结构或环境的变形情况&#xff0c;评估其稳定性和安全性&#xff0c;并采取相应的措施来预防灾害和保护人民生命财产安全。 变形监测主要包括的内容有&#…

Jenkins 构建触发器指南

目录 触发远程构建 (例如&#xff0c;使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如&#xff0c;使…

Nature Commun.:物理所揭示原子分辨下的铁电涡旋畴的原位力学转变过程

通过复杂的晶格-电荷相互作用形成的铁电涡旋畴在纳米电子器件研发中具有巨大的应用潜力。实际应用中&#xff0c;如何在外界激励下操纵这类结构的拓扑状态是至关重要的。中国科学院物理研究所/北京凝聚态物理国家研究中心表面物理国家重点实验室与北京大学、湘潭大学和美国宾夕…

surface pro 如何调用和显示软键盘/触摸键盘

长按任务栏-勾选☑显示触摸键盘 右下角就会出现软键盘按钮 如果点选输入栏自动弹出或调用软键盘或触控键盘&#xff0c;按如下设定 设置-输入-不处于平板电脑模式且未连接键盘时显示触摸键盘 &#xff08;开关打开即可&#xff09;

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

免费!Apipost IDEA插件

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…

docker安装ES:7.8和Kibana:7.8

本文适用于centos7,快速入手练习es语法 前置&#xff1a;安装docker教程docker、docker-component安装-CSDN博客 1.安装es 9200为启动端口&#xff0c;9300为集群端口 docker pull elasticsearch:7.8.0mkdir -p /mydata/elasticsearch/pluginsmkdir -p /mydata/elasticsear…

IDEA 黑色主题很难看到鼠标

“控制面板”—搜索“鼠标”关键字—选择“更改鼠标设置” 参考&#xff1a; IDEA 黑色主题很难看到鼠标

编码器脉冲信号测量2路DI高速计数器PNP/NPN转RS-485数据采集模块 YL150-485 标准Modbus RTU协议

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持编码器计数&#xff0c;可识别正反转 ● 也可以设置作为2路独立DI高速计数器 ● 计数值支持断电自动保存 ● DI输入支持PNP和NPN输入 ● 继电器和机械开关输入时可以…

​​​​​​​配置MUX VLAN示例(接入层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如图1所示&#xff0c;为了解决上述问题&#xff0c;可在连接终端…