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

Nuxt3组件v-for循环中删除加载状态全局同步问题求助

问题原因

你的useDbDelete composable存在设计问题:里面的pending、error、result是直接声明在模块顶层的全局共享变量。由于JS模块的加载机制是单例模式,所有组件导入这个composable时,拿到的都是同一个ref实例。

这就导致只要有一个NoteCard调用dbDelete把pending.value改成true,所有组件里的pendingDelete(本质是同一个全局ref)都会同步变化,最终所有卡片的删除按钮都变成加载状态。

解决方法

把useDbDelete改成工厂函数,每次调用时创建独立的状态变量,让每个NoteCard实例都拥有自己的pending、error状态:

// useDbDelete.js
export default function useDbDelete() {
  const pending = ref(false);
  const error = ref(null);
  const result = ref(null);

  const dbDelete = async (endpoint, id) => {
    pending.value = true;
    error.value = null; // 每次删除前重置错误状态
    result.value = null;
    
    try {
      await $fetch(`/api/${endpoint}/${id}/delete`, {
        method: "DELETE",
      });
      result.value = "Success";
    } catch (err) {
      error.value = err.message;
    } finally {
      pending.value = false; // 用finally确保请求结束后必重置pending
    }
  };

  return { dbDelete, result, pending, error };
}

接着修改NoteCard里的调用方式,需要执行函数来获取当前组件的独立状态:

// in script setup of NoteCard
const { dbDelete, pending: pendingDelete, error } = useDbDelete(); // 这里要加()调用函数

const deleteNote = async () => {
  await dbDelete("notes", props.note.id);
  if (!error.value) {
    emit("deleted");
  }
};
额外优化点
  • 用finally块替代直接在try/catch后设置pending.value = false,避免请求失败时pending一直处于true状态
  • 每次调用dbDelete前重置error和result,防止上次操作的残留状态干扰当前操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:29:51