You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PrimeVue Menu组件报错:Uncaught TypeError: this.$refs.menu.toggle is not a function如何解决?

PrimeVue Menu组件调用toggle方法报错:Uncaught TypeError: this.$refs.menu.toggle is not a function

问题代码

模板部分:

<template>
   <div>
      <i class="pi pi-ellipsis-v" @click="onActionClick"></i>
      <Menu :model="items" :popup="true" ref="menu" />
   </div>
</template>

脚本部分:

data() {
    return {
        items: [
            { label: 'New', icon: 'pi pi-fw pi-plus' },
            { label: 'Delete', icon: 'pi pi-fw pi-trash' }
        ]
    }
},
methods: {
    onActionClick(event) {
        this.$refs.menu.toggle(event);
    }
}

点击触发onActionClick方法时,控制台抛出错误:

Uncaught TypeError: this.$refs.menu.toggle is not a function

修复方案

  • 确认组件注册与Vue版本适配
    如果你用的是Vue3 + PrimeVue3+,要确保Menu组件已正确注册:可以全局注册,或者在当前组件局部导入注册:

    import { Menu } from 'primevue/menu';
    
    export default {
      components: { Menu },
      // 其他代码
    }
    

    同时,Vue3中$refs的获取需要确保组件已挂载,可通过nextTick延后调用:

    async onActionClick(event) {
        await this.$nextTick();
        this.$refs.menu?.toggle(event);
    }
    
  • 检查ref指向是否正确
    别把Menu放在v-for循环里,不然this.$refs.menu会变成数组,得对应取数组里的实例;另外要避免在组件未挂载的钩子(比如created)里调用toggle,要等mounted之后再操作。

  • 适配PrimeVue旧版本逻辑
    要是用的是PrimeVue2.x,popup菜单可能需要手动控制visible属性来显示隐藏,而不是直接调用toggle:

    <template>
       <div>
          <i class="pi pi-ellipsis-v" @click="visible = !visible"></i>
          <Menu :model="items" :popup="true" :visible="visible" @hide="visible = false" />
       </div>
    </template>
    
    data() {
        return {
            items: [...],
            visible: false
        }
    }
    
  • 添加可选链避免空值报错
    在调用toggle前加上可选链,防止$refs.menu未初始化时的报错:

    onActionClick(event) {
        this.$refs.menu?.toggle(event);
    }
    

内容的提问来源于stack exchange,提问作者Happy Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:18