代码之家  ›  专栏  ›  技术社区  ›  xTheWolf

在Vue 3中,初始化反应值时是否应该使用整个对象结构?

  •  1
  • xTheWolf  · 技术社区  · 11 月前

    假设我想在我的pinia存储中创建一个空值,该值包含用户正在查看的当前订阅模型。如果用户当前不在订阅详细信息页面上,则该值应为null/unset。

    用户单击该链接可转到订阅ID为1的订阅详细信息页面。在存储中,我将调度一个操作来获取订阅id 1的详细信息,并将端点返回的对象分配给该反应变量。

    export const useSubscriptionStore = defineStore("subscriptions", () => {
      let currentSubscription: Ref<SubscriptionModel> = reactive(null); // Null is not valid!
    
      async function loadSubscription(subscriptionId) {
        const { $api } = useNuxtApp();
    
        const { data } = await useAsyncData(() =>
          $api.subscriptions.getSubscription(subscriptionId),
        );
        currentSubscription.value = data.value;
      }
    
      return {
        loadSubscription,
      };
    });
    
    

    我是否应该将第2行中声明的反应变量设置为我希望后端返回的相同对象结构?难道不可能设置一个既能保持值的无功变量吗 null 还是一个物体?

    在Vue 2中,您可以使用 Vue.set()

    1 回复  |  直到 11 月前
        1
  •  1
  •   Estus Flask    11 月前

    正确的类型是 SubscriptionModel | null ,而且应该是 ref 而不是 reactive ,尤其是因为类型已经是 Ref .API函数通常是TypeScript中的泛型,这允许推断类型。使用 const 而不是 let 允许避免意外重新分配,这是导致反应性损失的常见错误。

    它应该是:

    const currentSubscription = ref<SubscriptionModel | null>(null);