我们在用 ElementUI 开发前端时,有时我们需要使用到组件 Dropdown 下拉菜单,比如在组件 Table 表格 的操作列中操作按钮较多的情况下,可以通过 Dropdown 来展示更多操作按钮。然而其点击菜单项触发的事件回调 command 只有一个参数,但是我们至少还需要传入行数据来区分是操作哪一行的数据,这时只能通过变通给 dropdown-menu 的属性 command 传入对象,将需要的字段都放入该对象,具体代码如下:

<el-table>
  <el-table-column label="操作" align="center" fixed="right">
    <template slot-scope="scope">
      <el-button type="text" size="small">详情</el-button>
      <el-button type="text" size="small">编辑</el-button>
      <el-dropdown @command="handleCommand">
        <el-button type="text" size="small">
          更多操作<i class="el-icon-arrow-down el-icon--right" />
        </el-button>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item
            v-for="(item, index) in opBtns"
            :key="index"
            :command="{ command: item.value, fn: item.fn, row: scope.row }"
            :disabled="item.disabled"
            :divided="item.divided">{{ item.text }}</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </template>
  </el-table-column>
</el-table>

<script>
export default {
  data() {
    return {
      opBtns: [
        {
          value: 'v1',
          text: '操作1',
          fn: 'fn1'
        },
        {
          value: 'v2',
          text: '操作2',
          fn: 'fn2'
        },
        {
          value: 'v3',
          text: '操作3',
          disabled: true
        },
        {
          value: 'v4',
          text: '操作4',
          fn: 'fn4',
          divided: true
        },
        {
          value: 'v5',
          text: '操作5',
          fn: 'fn5'
        }
      ]
    }
  },
  methods: {
    handleCommand(commandObj) { // 点击菜单项触发的事件回调
      const { command, fn, row } = commandObj
      if (fn) {
        const method = this.$options.methods[fn] // 获取对应操作函数
        method && method.call(this, row) // 执行对应的操作函数
      }
    },
    fn1(item) {
      console.info(item, 'fn1')
    },
    fn2(item) {
      console.info(item, 'fn2')
    }
  }
}
</script>

为了方便,我们把 Dropdown 中的按钮操作处理函数也通过变量传递。

知识点:

  • this.$options.methods:获取当前组件下 method 内的所有函数。
  • this.$options.methods.call(this, row):调用获取到的函数,并重新指定 this 指向。

最终效果图:

如果觉得我的文章对你有用,请点个赞