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

Vue3循环生成按钮打开对应Popup时仅显示最后一条数据如何解决

问题根因

所有循环渲染的按钮和弹窗都共用了同一个触发状态字段popupTriggers.buttonTriggerDetail,点击任意按钮都会将该字段置为true,导致所有弹窗同时渲染,最后一个渲染的弹窗层级最高会覆盖其他所有弹窗,因此只会显示最后一项的关联数据。

修复方案

调整模板绑定逻辑

将弹窗触发的唯一标识替换为每个循环项的唯一值,此处直接复用你循环已配置的infoItem.name作为唯一标识即可:

<template>
  <div v-for="infoItem in data" :key="infoItem.name">
    <Button
      icon="pi pi-eye"
      @click="() => TogglePopup(infoItem.name)"
    ></Button>

    <Popup
      v-if="popupTriggers[infoItem.name]"
      :TogglePopup="() => TogglePopup(infoItem.name)"
    >
      {{ infoItem.control }}
    </Popup>
  </div>
</template>

调整状态触发逻辑

适配动态生成的弹窗标识,不需要提前预定义所有触发字段:

<script>
// 原有import逻辑保持不变
export default {
  computed: {
    data() {
      return this.$store.state.data;
    },
  },
  mounted() {
    this.$store.dispatch("getData");
  },

  setup() {
    // 不需要提前预定义触发字段,改为空对象动态存储
    const popupTriggers = ref({});
    const TogglePopup = (trigger) => {
      // 不存在的标识默认按false处理,再取反实现开关效果
      popupTriggers.value[trigger] = !popupTriggers.value[trigger] ?? true;
    };

    return {
      Popup,
      TogglePopup,
      popupTriggers,
    };
  },
};
</script>

修改后每个按钮只会触发对应唯一标识的弹窗显示,不会出现多弹窗重叠的问题,展示的数据也会和对应按钮的关联数据匹配。

内容的提问来源于stack exchange,提问作者Kate P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:54:00