el-dropdown组件,菜单自适应

记录个问题:在切换屏幕大小的时候菜单没有自适应,菜单会展示在整个页面的左上角。

1、 根据这个情况,首先想到的是使用 position 属性,用于设置弹出菜单的位置。可以将其设置为start、end、top、bottom等值,用来控制菜单出现的位置。

2、el-dropdown-menu提供了 visible 属性,用于控制下拉菜单的显示和隐藏。通过监听窗口大小变化事件,在窗口大小变化是手动设置 visible 属性,但是并没有实现菜单的自动化。

3、通过自定义 css 样式控制下拉菜单的位置。(未尝试,感兴趣的小伙伴可以试试)

下面就说说我是怎么实现的

使用 el-dropdown 的 visible-change 下拉框出现/隐藏时触发事件,并结合 mouseenter 和 mouseleave 事件

话不多说直接上代码

<div
          slot-scope="{ node, data }"
          class="custom-tree-node"
          @mouseenter="mouseenter(data)" @mouseleave="data.isLeave && mouseleave(data)"
        >
          
          {{node.reportName}}
          <div style="flex: 1" />
          <div v-show="currentHover === data.id">
            <el-dropdown trigger="click" @command="clickMenu($event, data)" style="margin-top: 0;" @visible-change="dropDownShow($event, data)">
              <span class="el-dropdown-link">
                <i class="el-icon-more rotate" />
              </span>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item
                  v-for="item in suboperateList"
                  :key="item.label"
                  :command="item.funcName"
                  :icon="item.icon"
                >
                  {{ item.label }}
                </el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
          </div>
        </div>

  data() {
    return {
      suboperateList: [
        {
          funcName: "detail",
          label: "详情",
          icon: "el-icon-warning-outline",
        },
        {
          funcName: "edit",
          label: "编辑",
          icon: "el-icon-edit",
        },
        {
          funcName: "del",
          label: "删除",
          icon: "el-icon-delete",
        },
      ],
    };
  },

methods: {
    
    /**
     * 点击三点,下拉框出现
     */
		dropDownShow (show, data) {
			if (show) {
				data.isLeave = false
			} else {
				data.isLeave = true
			}
			data.isDrapShow = show
			this.$set(data, 'del', show)
		},
    /**
     * 鼠标进入tree
     */
		mouseenter (data) {
			data.isLeave = true
			if (data.isDrapShow) {
				data.isLeave = false
			}
			this.$set(data, 'del', true)
		},

    /**
     * 离开tree
     */
		mouseleave (data) {
			this.$set(data, 'del', false)
		},
    /**
     * 菜单回调事件
     */
    clickMenu() {
       console.log('菜单回调事件')
    },
},

.el-icon-more:before {
  color: #c0c4cc;
  font-size: 20px;
}
.rotate {
  cursor: pointer;
  margin-left: 5px;
  transform: rotate(90deg);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值