Vue3通过 directive 实现 el-dropdown下拉菜单项最小宽度等于内容宽度

这篇具有很好参考价值的文章主要介绍了Vue3通过 directive 实现 el-dropdown下拉菜单项最小宽度等于内容宽度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 初始效果与最终效果

原始效果 最终效果
Vue3通过 directive 实现 el-dropdown下拉菜单项最小宽度等于内容宽度,vue.js,前端,elementui Vue3通过 directive 实现 el-dropdown下拉菜单项最小宽度等于内容宽度,vue.js,前端,elementui

2. 分析

el-dropdown API 并不提供配置项让我们实现下拉菜单项最小宽度等于内容宽度,但我们能发现它提供了 popper-class 用于自定义浮层类名。
那么我们是否可以通过 popper-class 配置项来实现想要的功能呢?或者通过 <el-dropdown-menu style="min-width: 100px;"> 这种形式进行最小宽度的设置?

答案明显是可行的,但有个问题:这两种方式设置最小宽度是需要提前知道内容宽度的值,那么就得在编码的时候限定一个值,限制性太大了。


3. 解决思路:directives

既然我们知道了通过 popper-class 配置项是可以实现效果的,所以我们只需要解决内容宽度计算并且设置下拉框最小宽度即可。
查阅 Vue3 文档,发现 directive 这个 API 可以让我们自定义指令,使 el-dropdown 渲染的时候进行自定义计算,获取内容宽度的同时设置下拉框选项的最小宽度。


4. 代码实现

  1. 定义 siem-dropdown 指令
    注:这里是新建了一个 siemDropdown.js 文件进行指令定义,目录:siem/share/directives/siemDropdown

    function setDropdownMinWidth(el, binding, vNode) {
        const { props, uid } = vNode.ctx; // 获取下拉菜单实例的 uid 和 props
        const siemDropdownClass = `siem-dropdown-${uid}`;
        if (props.popperClass?.indexOf(siemDropdownClass) === -1) {
            props.popperClass += ` ${siemDropdownClass}`; // 添加自定义浮层类名 popper-class
        }
    
        if (el) {
            setTimeout(() => {
                const $dom = document.querySelectorAll(`.${siemDropdownClass}`)[0]; // 获取下拉菜单项浮层元素
                if (el?.offsetWidth) {
                    $dom.style.minWidth = el.offsetWidth + 'px'; // 设置最小宽度为下拉菜单内容宽度
                }
            }, 100);
        }
    }
    
    const siemDropdown = {
        mounted: setDropdownMinWidth,
        updated: setDropdownMinWidth,
    };
    
    export default siemDropdown;
    
    
  2. 全局绑定 siem-dropdown 指令

    import siemDropdown from 'siem/share/directives/siemDropdown';
    
    export default function bindAllConfigs(APP){
        APP.directive('siem-dropdown', siemDropdown); // 全局绑定 siem-dropdown 指令
    }
    
  3. el-dropdown 使用 siem-dropdown 指令

    <el-dropdown
         v-siem-dropdown 
         @command="handleBatchOperation"
         style="margin-left: 8px;"
     >
         <el-button>
             <span style="display: inline-flex; align-items: center;">
                 用于测试的更多操作很长很长
                 <el-icon>
                     <arrow-down />
                 </el-icon>
             </span>
         </el-button>
         <template #dropdown>
             <el-dropdown-menu>
                 <el-dropdown-item command="test1">
                     测试1
                 </el-dropdown-item>
                 <el-dropdown-item command="test2">
                     测试2222
                 </el-dropdown-item>
                 <el-dropdown-item command="test3">
                     测试3
                 </el-dropdown-item>
             </el-dropdown-menu>
         </template>
     </el-dropdown>
    

小结

通过实现这个效果,学会了如何使用 directive,感觉还是很有收获的。
愿各位也能从中有所收获吧~~文章来源地址https://www.toymoban.com/news/detail-708197.html

到了这里,关于Vue3通过 directive 实现 el-dropdown下拉菜单项最小宽度等于内容宽度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3+element ui取消el-select下拉选边框

    需求是: 取消下拉选的边框,并且修改下箭头的图标,从其他博主那拼凑修改出来的,适用于我项目的方法,在此做个记录 修改前 修改后 css样式

    2024年02月15日
    浏览(48)
  • 解决element UI中 select下拉框 el-select-dropdown el-popper超出el-dialog弹框的问题

    【问题】: 在elementUI 中,el-dialog的内容比较多,出现滚动条,且内容包含input输入框、select下拉框、时间选择器、cascader级联选择器等,在点开select下拉选择框后并向下滚动鼠标,会出现下拉框跑出el-dialog的区域的情况(有可能离el-dialog的区域很远),造成页面的展示效果混

    2024年02月09日
    浏览(34)
  • 【VUE3】ElementUI--el-date-picker下拉控件样式修改(高亮显示设置)

    可以看到在截图中这个日期默认高亮显示的是30号,但是我选中其他日期后30号这个数字的高亮并没有移除。 年、月的样式同理。 这显然是不符合需求的,但是又需要用到这些控件,所以就可以通过style来改写el-date-picker的对应样式,以使组件达到需求要求的效果。 于是我通

    2024年02月02日
    浏览(46)
  • Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式

    今天在项目中碰到一个 UI 改造的需求,需要根据设计图把页面升级成 UI 设计师提供的设计图样式。 到最后页面改造完了,但是 UI 提供的下拉菜单样式全部是黑色半透明的,只能硬着头皮改了。 然后,就有了一下午的头脑风暴。 一开始,我是想着使用 /deep/ 来深度修改样式

    2024年01月17日
    浏览(46)
  • vue+element-ui Dropdown下拉菜单(获取某行数据)

    1、通过command方法直接传当前选中行的整个数据 html js 效果:

    2024年02月16日
    浏览(41)
  • vue+el-select下拉实现:全选、反选、清空功能

    问题描述: el-select下拉框要求实现全选功能。具体功能包括: 当选择【全选】时,所有选项全部被勾选; 当选择【反选】时,已选择选项变为未选择选项,未选项变为已选项 当选择【清空】时,所有选项变为未选 如下图: 1、给el-select增加【全选】【清空】【反选】按钮

    2024年02月10日
    浏览(52)
  • Vue3 实现下拉选择框多选的功能实现

    项目采用vue3+elmentui-plus +ts 搭建成的。用户界面设计上需要一个带全选的下拉选择框。而element plus 官网 提供的下拉多选框是 这种形式是没有全选按钮的,并且样式也不符合想像中的全选的操作。故开始想法子去结合一个新的条件去封装一个新的组件。 由于用户更加热衷于带

    2024年02月12日
    浏览(29)
  • Vue+Element Ui实现el-table自定义表头下拉选择表头筛选

    用vue+element ui开发管理系统时,使用el-table做表格,当表格列过多的时候,想要做成可选表头的,实现表格列的筛选显示,效果如下: 代码文件结构: 废话不多说,直接上代码: 第一步:新建名为 TableHeaderRender.vue 的文件 template   el-popover     placement=\\\"bottom\\\"     width=\\\"2

    2024年02月02日
    浏览(51)
  • Vue+EleMentUI实现el-table-colum表格select下拉框可编辑

    在进行采购入库的过程中,有必要对表格中的一行进行快速编辑保存,节省时间,提高工作效率!,而不是每次编辑都要弹窗才可编辑 源码:https://gitee.com/charlinchenlin/store-pos 控制是否显示select下拉框 如果showInput的值与当前的inboundId相同,则显示下拉选项,否则显示数据信息

    2024年02月01日
    浏览(74)
  • Unity3D邪门实现之GUI下拉菜单Dropdown设计无重复项

    ** Unity3D邪门实现系列为博主在实际开发过程中遇到一些需求,由于个人水平无法正经实现退而采用“歪道”实现同样的效果。** 该系列仅用于分享思路,若有错误或“多此一举”的地方,也请大家多多指正。 利用按钮和下拉菜单结合的形式,点击按钮显示下拉菜单,实现菜

    2024年02月02日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包