vue3 + elementPlus实现select下拉框插入确定和取消按钮。

news2024/11/22 18:58:56

实现思路

Select 选择器 | Element Plus

1、select方法@visible-change这个方法是下拉框出现/隐藏时触发,当显示的时候将两个按钮插入到下拉框里面,是基于原生插入DOM的这种方式;

2、通过vue3 ref获取selectDOM,在获取select的popperPaneRef.$el (select下拉框的DOM),在基于js方法创建div `document.createElement('div')` 而div里面放入两个按钮使用div.appendChild插入按钮;

3、最后将div按钮插入到 popperPaneRef.$el(select下拉框的DOM)里就可以了,在将element-button-mini的css按钮样式复制,添加到原生按钮身上;

4、这里是无法使用el-button这种组件因为不解析,只能使用原生button,为其添加ele的样式;

具体实现看代码 

<template>
  <el-table :data="tableData" border style="width: 100%">
    <el-table-column align="right" label="Date" prop="date" width="280">
      <template #header>
        <div class="headers-slot">
          <p  v-if="!isShowSelect"> Date <span @click="isShowSelect = !isShowSelect"> 🔍 </span> </p>
          <div v-else>
            🔍 <el-select
                v-model="value3"
                multiple
                placeholder="Select"
                style="width: 180px"
                @visible-change="visibleChange"
                ref="filterSelect"
            >
              <el-option
                  v-for="item in options"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
              />
            </el-select>
          </div>
        </div>
      </template>


    </el-table-column>
    <el-table-column label="Name" prop="name" width="180"/>
    <el-table-column label="Address" prop="address"/>
  </el-table>
</template>

<script setup>
import {reactive, ref} from "vue";

const value3 = ref([])
const filterSelect = ref()
let isShowSelect = ref(false)
const options = reactive([
  {
    value: 'key-1',
    label: '今天',
  },
  {
    value: 'key-2',
    label: '明天',
  },
  {
    value: 'key-3',
    label: '后天',
  },
  {
    value: 'key-4',
    label: '昨天',
  },
  {
    value: 'key-5',
    label: '前天',
  },
])

let tableData = ref([
  {
    date: '今天',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '明天',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '后天',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '昨天',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '前天',
    name: 'Tom222',
    address: 'No. 189, Grove St, Los Angeles',
  },
])

const visibleChange = (visible) => {
  console.log(visible,filterSelect)
  // 下拉框显示隐藏
  if (visible ) {
    const ref = filterSelect.value
    // 拿到下拉选项的对象
    let popper = ref.popperPaneRef
    // 在拿到它的DOM元素
    if (popper.$el) popper = popper.$el
    // 判断是否有添加按钮
    if (!Array.from(popper.children).some(v => v.className === 'select-btn-box')) {
      // 插入按钮
      let el = document.createElement('div')
      let cancelBtn = document.createElement('button')
      let confirmBtn = document.createElement('button')
      el.className = 'select-btn-box'
      cancelBtn.className = 'select-cancel-mini-btn'
      confirmBtn.className = 'select-confirm-mini-btn'
      cancelBtn.innerText = '取消'
      confirmBtn.innerText = '确定'
      el.appendChild(cancelBtn)
      el.appendChild(confirmBtn)
      // 调用确认和取消函数
      cancelBtn.onclick = () => cancelHandle()
      confirmBtn.onclick = () => confirmHandle()
      popper.appendChild(el)
    }
  }
}

const cancelHandle = () => {
  console.log('取消',value3.value)
  isShowSelect.value = false
}

const confirmHandle = () => {
  console.log('确认',value3.value)
  isShowSelect.value = false
}
</script>
<style>
.headers-slot {
  display: flex;
  align-items: center;
  justify-content: space-around;
}
/*
 这些是按钮css,复制底层ele-btn-mini的
*/
.custom-button {
  display: inline-block;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  background: #fff;
  color: #fff;
  -webkit-appearance: none;
  text-align: center;
  box-sizing: border-box;
  outline: 0;
  margin: 0;
  padding: 10px 15px;
  font-size: 14px;
  border-radius: 4px;
}
.select-btn-box{
  display: flex;
  border-top: 1px solid #dfe6ec;
  width: 100%;
  height: 44px;
  align-items: center;
  justify-content:flex-end ;
}
.select-cancel-mini-btn{
  display: inline-block;
  display: inline-block;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  background: #FFFFFF;
  border: 1px solid #DCDFE6;
  border-color: #DCDFE6;
  color: #606266;
  -webkit-appearance: none;
  text-align: center;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  outline: none;
  margin: 0;
  -webkit-transition: 0.1s;
  transition: 0.1s;
  font-weight: 400;
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  padding: 7px 15px;
  font-size: 12px;
  border-radius: 3px;
  margin-right: 10px;
}
.select-cancel-mini-btn:hover{
  background-color:#e4f2fe ;
  color: #349cfb;
  border-color: #afd9fd;
}
.select-confirm-mini-btn:hover{
  background-color: #339bfa;
}
.select-confirm-mini-btn{
  display: inline-block;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  background: #fff;
  border: 1px solid #dcdfe6;
  -webkit-appearance: none;
  text-align: center;
  box-sizing: border-box;
  outline: none;
  margin: 0;
  transition: 0.1s;
  font-weight: 500;
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  padding: 12px 20px;
  font-size: 14px;
  border-radius: 4px;
  color: #fff;
  background-color: #0080f5;
  border-color: #409eff;
  padding: 7px 15px;
  font-size: 12px;
  border-radius: 3px;
  margin-right: 10px;
}
span{
  cursor: pointer;
}
</style>

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

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

相关文章

Konva基本处理流程和相关架构设计

前言 canvas是使用JavaScript基于上下文对象进行2D图形的绘制的HTML元素&#xff0c;通常用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。基于Canvas之上&#xff0c;诞生了例如 PIXI、ZRender、Fabric、Konva等 Canvas渲染引擎&#xff0c;兼顾易用的同时…

Java项目实战-查询用户列表接口服务搭建

概述 这里通过设计一个对用户进行增删改查的接口服务&#xff0c;来练习java项目工程化、Spring框架、Mybatis框架的实际应用 本项目目录 上一节初始化项目&#xff0c;已经controller层了&#xff0c;下方新建包&#xff1a;pojo、mapper、service pojo:所有的实体类都放这…

ternsor合并与分割

拼接&#xff1a;拆分&#xff1a;Cat、StackSplit、Chunk 1、cat&#xff08;concat&#xff09; 统计班级学生成绩&#xff1a; [class1-4, students, scores] [class5-9, students, scores] 将这九名学生的成绩进行合并 a torch.rand(4, 32, 8) b torch.rand(5, 32, 8…

A股风格因子看板 (2023.09 第09期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第9期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…

2023年最新电商某东app端sign签名算法与cipher加解密逆向分析(2023-09-26)

前言&#xff1a; 本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01;技术交流合作请私信&#xff01; 一.工具的选择&#xff08;抓包工具的选择&#xff0c;是门学问&#xff09; 用…

智能交通RFID设备的实际应用有哪些?

随着RFID应用的不断普及&#xff0c;交通系统中也引入了RFID来用作车辆的识别和监控&#xff0c;如我们常见的车辆前挡风玻璃内侧安装的RFID电子标签进行通信&#xff0c;可以实现对车辆的自动、非接触、不停车识别和监控。下面我们就一起来了解一下&#xff0c;智能交通RFID设…

《学术小白学习之路11》DTM主题动态模型原理与基础构建

《学术小白学习之路》DTM主题动态模型构建 一、LDA与DTM的区别二、代码实操2.1 数据2.2 获取数据向量2.3 参数设置与模型构建2.4 结果的输出一、LDA与DTM的区别 LDA主题模型主要针对一段段的文档 可以得出每个主题,所对应主题词的词语的概率 该模型的主题概率的生成是基于文…

大规模语言模型的模型结构---编码器-解码器结构(GLM,UL2系列)

2020 年 Open AI 发布了由包含 1750 亿参数的神经网络构成的生成式大规模预训练语言模型 GPT-3 (Gener- ative Pre-trained Transformer 3)。开启了大规模语言模型的新时代。由于大规模语言模型的参数量巨大&#xff0c; 如果在 不同任务上都进行微调需要消耗大量的计算资源&a…

单元测试、集成测试、系统测试到底有什么不同?

单元测试、集成测试和系统测试是软件测试开发中不可或缺的部分。 单元测试 范围&#xff1a;单元测试是对软件中最小的可测试单元的测试&#xff0c;通常是函数、方法或类。 目的&#xff1a;它的目标是验证每个单独的单元是否按照预期工作&#xff0c;以增加代码的可靠性和稳…

斩获双奖!人大金仓亮相第六届智慧医疗创新大赛全国总决赛

9月22日&#xff0c;2023数字健康创新大会暨第六届智慧医疗创新大赛全国总决赛圆满结束。凭借在智慧医疗领域的创新成果&#xff0c;人大金仓荣获“最佳原创奖”以及医疗信创赛道“二等奖”&#xff0c;获得业内专家、用户、相关单位领导及医疗伙伴的高度认可。 获奖证书 左右滑…

MySQL的时间差函数、日期转换计算函数

MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date) 时间差函数&#xff08;TIMESTAMPDIFF、DATEDIFF&#xff09; 需要用MySQL计算时间差&#xff0c;使用TIMESTAMPDIFF、DATEDIFF&#xff0c;记录一下实验结果 --0 …

如何学习maya mel语言的经验分享

一、前言 总结一下这十几年来学习和使用mel语言的一些经验&#xff0c;供初学朋参考&#xff0c;哈哈。 这里不说深奥理论&#xff0c;只是朴实经历陈述。 其实&#xff0c;早在2003年&#xff0c;最初接触maya时&#xff0c;就已经涉及到mel的学习&#xff0c;当时在大学里接…

究竟是什么样的讲解二分查找算法的博客让我写了三小时???

版本说明 当前版本号[20230926]。 版本修改说明20230926初版 目录 文章目录 版本说明目录二分查找基础版算法描述分步演示情况一&#xff1a;能在有序数组找到待查值情况二&#xff1a;不能在有序数组找到待查值 翻译成代码基础版代码&#xff08;包括测试类&#xff09;疑惑…

regsvr32 initpki.dll找不到指定模块要怎么解决?教你快速修复initpki.dll文件

当你尝试在 Windows 操作系统中注册 DLL 文件时&#xff0c;可能会遇到错误消息&#xff1a;“regsvr32 initpki.dll找不到指定模块”。它通常是由于一个或多个 DLL 文件缺失或损坏所导致的。这是一个常见的错误&#xff0c;并且可以遇到在 Windows 7、Windows 8 和 Windows 10…

百度实习一面(知识图谱部门)

百度面经&#xff08;知识图谱部&#xff09;一面 1.自我介绍 介绍完了&#xff0c;打开共享&#xff0c;对着简历一点一点问 2.ffmpeg在项目中是怎么使用的 回答了ffmpeg在项目中使用的命令&#xff0c;用来干了什么 3.为什么使用toml配置&#xff0c;了解过yml配置吗&am…

【Vue3 源码解析】computed

export function computed<T>(getter: ComputedGetter<T>,debugOptions?: DebuggerOptions ): ComputedRef<T> export function computed<T>(options: WritableComputedOptions<T>,debugOptions?: DebuggerOptions ): WritableComputedRef<…

SPA项目之主页面--动态树右侧内容管理

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.左侧动态树 1.定义组件 ①样式…

【神印王座】悲啸洞穴之物揭晓,圣采儿差点被骗,幸好龙皓晨聪明

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析神印王座。 神印王座动漫现阶段已经出到龙皓晨等人接取新任务深入魔族地界的阶段&#xff0c;而龙皓晨等人接取的任务想必现在大家都知道了&#xff0c;那就是探索魔族地界中的悲啸洞穴。但是大家知道悲啸洞穴里面藏着什么…

智能的障碍:符号化

基于事实与价值叠加的算计与基于事实的计算有着明显的区别。 基于事实的计算是指根据已有的客观事实和数据进行计算和推理。在这种计算中&#xff0c;只考虑和利用与事实相关的信息和数据&#xff0c;目的是得出合理的、基于客观事实的结论。例如&#xff0c;使用数学公式和逻辑…

python实现全局变量共享,一个全局变量在多个文件中使用

因为业务需求要将抓到的数据进行累加统计&#xff0c;而且还要间隔三秒钟将这个数据推送到服务端&#xff0c;所以就要实现一个全局变量来记录这个数据&#xff0c;而且推送服务要每隔三秒钟就推送一次到服务端。之前使用了一个全局文件common.py&#xff0c;里面存储这个变量t…