element-ui 下拉菜单 el-dropdown-menu 组件 不能动态渲染数据怎么解决?

本文探讨了如何在Element-UI的el-dropdown-menu组件中动态渲染数据,分享了两种不同写法的解决方案,以及为何写法一遇到问题,最终提供了一种有效且可复用的循环el-dropdown-item的正确方式。

关于element-ui 下拉菜单 el-dropdown-menu 组件 不能动态渲染 数据怎么解决?

element-ui 官网中的例子是这样写的

<el-dropdown>
  <span class="el-dropdown-link">
    下拉菜单<i class="el-icon-arrow-down el-icon--right"></i>
  </span>
  <el-dropdown-menu slot="dropdown">
    <el-dropdown-item>黄金糕</el-dropdown-item>
    <el-dropdown-item>狮子头</el-dropdown-item>
    <el-dropdown-item>螺蛳粉</el-dropdown-item>
    <el-dropdown-item disabled>双皮奶</el-dropdown-item>
    <el-dropdown-item divided>蚵仔煎</el-dropdown-item>
  </el-dropdown-menu>
</el-dropdown>

<style>
  .el-dropdown-link {
    cursor: pointer;
    color: #409EFF;
  }
  .el-icon-arrow-down {
    font-size: 12px;
  }
</style>

写法一

我一开始是这样写的,循环的是整个 el-dropdown-item 组件,
v-for语句写在了el-dropdown-menu 里,发现页面上只能渲染出列表中最后一个元素。
说明这种写法不能动态渲染数据

 <template>
<div>
    <el-dropdown trigger="click" >
          <span class="el-dropdown-link" ref="ellink" >
            {{ test_obj.title }}<i class="el-icon-arrow-down el-icon--right" />
          </span>
          <el-dropdown-menu slot="dropdown" align="center" v-for="item in test_obj.arr" :key="item.id">
            <el-dropdown-item   > 
              {{ item.desc }}
            </el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
</div>
</template>
<script>
export default {
    name:'test',
    data(){
        return {
            test_obj:{
                title:'测试下拉菜单',
                arr:[
                    {id:1,desc:'测试1'},
                    {id:2,desc:'测试2'},
                    {id:3,desc:'测试3'}
                ]
            }
            
        }
    }
}
</script>

结果只显示列表中最后一个数据
在这里插入图片描述

写法二
换成以下写法,直接在 el-dropdown-item 组件里写v-for语句,发现可以动态渲染,满足我项目中的需求

 <el-dropdown trigger="click" ref="eldrop">
          <span class="el-dropdown-link" ref="ellink" >
            {{ Global.default_department.name }}<i class="el-icon-arrow-down el-icon--right" />
          </span>
  <el-dropdown-menu slot="dropdown" align="center" >
    <el-dropdown-item v-for="department in Global.departments" @click.native="getDepartment(department)" :key="department.id"> 
      {{ department.name }}
    </el-dropdown-item>
  </el-dropdown-menu>
</el-dropdown>

在这里插入图片描述

查看了下两种写法渲染后的真实html内容如下
写法一的,只渲染最后一组的html
    <ul class="el-dropdown-menu el-popper" align="center" id="dropdown-menu-3569" style="transform-origin: center top; z-index: 2011; position: absolute; top: 27px; left: 672px;" x-placement="bottom-end">
        <li tabindex="-1" class="el-dropdown-menu__item">
            测试1
        </li>
        <div x-arrow="" class="popper__arrow" style="left: 19px;"></div>
    </ul>
    <ul class="el-dropdown-menu el-popper" align="center" id="dropdown-menu-3569" style="transform-origin: center top; z-index: 2012; position: absolute; top: 27px; left: 672px;" x-placement="bottom-end">
        <li tabindex="-1" class="el-dropdown-menu__item"> 
                    测试2
        </li>
        <div x-arrow="" class="popper__arrow" style="left: 19px;"></div>
    </ul>
    <ul class="el-dropdown-menu el-popper" align="center" id="dropdown-menu-3569" style="transform-origin: center top; z-index: 2013; position: absolute; top: 27px; left: 672px;" x-placement="bottom-end">
        <li tabindex="-1" class="el-dropdown-menu__item">
            测试3
        </li>
        <div x-arrow="" class="popper__arrow" style="left: 19px;"></div>
    </ul>
写法二的,正常渲染了的html
    <ul class="el-dropdown-menu el-popper" align="center" id="dropdown-menu-3203" style="position: absolute; top: 27px; left: 809px;      transform-origin: center top; z-index: 2007;" x-placement="bottom-end">
        <li tabindex="-1" class="el-dropdown-menu__item">
            测试A
        </li>
        <li tabindex="-1" class="el-dropdown-menu__item">
            测试B
        </li>
        <li tabindex="-1" class="el-dropdown-menu__item">
            测试C
        </li>
        <div x-arrow="" class="popper__arrow" style="left: 8px;"></div>
    </ul>

可以得出,写法二其实也渲染了三个li元素,但是位置重合了,根据z-index大小,只显示最后一个数据。
所以写下拉菜单时,只循环el-dropdown-item组件中的内容就可以正常动态渲染数据。

### element-ui el-dropdown-menu 动态用法 #### 属性介绍 `el-dropdown-menu` 是 `el-dropdown` 组件的一部分,通常用来展示下拉菜单的内容。其主要属性如下: - **type**: 可能用于定义下拉菜单的样式或类型(具体取决于 Element UI 的版本和组件实现)[^2]。 - **placement**: 定义下拉菜单相对于触发元素的位置,常见的取值有 top、bottom、top-start、bottom-start 等。 - **trigger**: 触发方式,默认支持 hover 和 click 两种模式。 为了实现更灵活的应用场景,可以通过编程方式控制 `el-dropdown-menu` 的显示与隐藏以及动态更新菜单项。 #### 动态用法示例 下面是一个简单的例子来说明如何通过 Vue.js 实现 `el-dropdown-menu` 的动态加载数据并响应用户交互操作: ```html <template> <div class="example"> <!-- 使用 v-model 控制 dropdown 显示状态 --> <el-dropdown ref="dropdownRef" @command="handleCommand" trigger="click"> <span class="el-dropdown-link">更多<i class="el-icon-arrow-down el-icon--right"></i></span> <el-dropdown-menu slot="dropdown"> <!-- 循环渲染 menu items --> <el-dropdown-item :key="item.value" v-for="item in dynamicItems">{{ item.label }}</el-dropdown-item> </el-dropdown-menu> </el-dropdown> <button @click="toggleDropdown()">切换</button> <!-- 手动打开/关闭下拉框按钮 --> </div> </template> <script> export default { data() { return { visible: false, dynamicItems: [ { value: 'option1', label: '黄金糕' }, { value: 'option2', label: '双皮奶' } ] }; }, methods: { handleCommand(command) { console.log(`选中了 ${command}`); }, toggleDropdown() { this.$refs.dropdownRef.show(); // 或者使用 hide() } } }; </script> ``` 在这个案例里,展示了怎样利用 JavaScript 来管理 `el-dropdown-menu` 中的数据源 (`dynamicItems`) 并且实现了手动调用 API 接口改变下拉列表可见性的功能。此外还绑定了 `@command` 事件监听器以便处理用户的选项选择行为[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值