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

Vue3组合式API使用PrimeVue时p-menu菜单不更新问题求助

问题根因

你代码中的items为普通ref类型数组,初始化时仅会读取一次quote.value.display_item_date的静态值,后续quote内属性更新时,items数组内的visible字段不会自动同步更新,而PrimeVue的p-menu组件仅会在绑定的model属性发生引用变更时重新渲染菜单,因此无法出现预期的按钮切换效果。

解决方案

推荐使用计算属性computed定义菜单列表,它会自动跟踪依赖的响应式变量,当quote内的属性变更时自动重新计算菜单配置,实现视图自动更新:

  1. 首先从Vue导出对象中新增引入computed
  2. 将原有的items ref替换为computed定义

修正后的核心代码

setup() {
  const {
    onMounted,
    ref,
    watch,
    computed // 新增导入
  } = Vue;

  const data = ref(frontEndData);
  const quoteIsEdit = ref(false);

  const toggle = (event) => {
    menu.value.toggle(event);
  };
  const quote = ref({
    display_item_date: true,
    display_tax: true,
    display_discount: false,
  });
  const menu = ref();
  // 替换原ref定义为computed
  const items = computed(() => [
    {
      label: data.value.common_lang.options,
      items: [
        {
          visible: quote.value.display_item_date,
          label: data.value.common_lang.hide_item_date,
          icon: 'pi pi-eye-slash',
          command: (event) => {
            quote.value.display_item_date = !quote.value.display_item_date;
          }
        },
        {
          visible: !quote.value.display_item_date,
          label: data.value.common_lang.unhide_item_date,
          icon: 'pi pi-eye',
          command: () => {
            quote.value.display_item_date = !quote.value.display_item_date;
          }
        }
      ]
    }
  ]);

  return {
    data,
    quoteIsEdit,
    menu,
    items,
    toggle
  };
}

补充说明

如果不想用计算属性,也可以通过watch监听quote.value.display_item_date变化,手动修改items数组内对应的visible值后重新赋值给items触发视图更新,但是computed写法更简洁易维护。

内容的提问来源于stack exchange,提问作者Ammar Ismaeel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:24:04