我喜欢在特定的Piniastore 执行大量查询的 idea ,因为我可以在代码中的任何地方重用这些函数,但我正在努力实现它.我有以下Piniastore 来购买产品:

//using composition api in Pinia
import { ref } from 'vue';
import { defineStore } from 'pinia';

export const useProductStore = defineStore('product', () => {
  const config = useRuntimeConfig();
  const isLoading = ref(false);

  const getProductData = async (id) => {
    isLoading.value = true
    try {
      const query = gql`
        query GetProductsById($id: ID!) {
          product(id: $id) {
            id
            title
            vendor
            publishedAt
            handle
            variants(first: 100) {
              nodes {
                id
                title
                price {
                    amount
                }
                image {
                    url
                    altText
                    width
                    height
                }
              }
            }
          }
        }
      `
      const variables = { 
        id: "gid://shopify/Product/" + id,
      }
      
      var results = await useAsyncQuery(query, variables);
      isLoading.value = false
      return results

    } catch {
      isLoading.value = false
      return null
    }
  };

  return {getProductData, isLoading};
});

然后,在我的产品页面中,我try 实现以下内容以显示结果:

<template>
  <div class="bg-white">
    {{ JSON.stringify(product.value) }}
  </div>
</template>
  
<script setup>
  import { ref } from 'vue'
  import { storeToRefs } from 'pinia';
  import { useProductStore } from '../stores/product-store';
  import {useRoute } from 'vue-router'


  const route = useRoute();
  const productStore = useProductStore();
  const { isLoading } = storeToRefs(productStore);
  const product = computed(() => {
    if (isLoading.value == true) {
      return null;
    } else {
      return productStore.getProductData(route.query.id);
    }
  });
</script>

我这样做,null总是显示在屏幕上,但是我认为计算(computed)属性是react 性的,一旦函数完成,它应该显示我的数组的值.我确实try 了console.log(productStore.getProductData(route.query.id)),它将返回promise并显示目标中的数据.我也很不好用JavaScript中的javascript/await,所以我不知道这里出了什么问题.

推荐答案

有几个问题.getProductData不使用react 性数据,.value应该在模板中省略,promise 在其结果用于计算之前需要展开.

产品数据应该是store 状态的一部分,不需要isLoading状态,因为null意味着缺少数据:

const product = ref(null)
...
async function getProductData(...) {
  ...
  product.value = null
  product.value = await useAsyncQuery(...)
}

return {product, getProductData}

根据首选的缓存行为,可以保留先前的product值.

product个存储状态准备好在组件中使用时,不需要计算product.

在组件中至少需要调用getProductData一次,无论是在onMounted中还是在与Suspense一起使用时的设置主体中.如果它需要对同一路由上的id个变化做出react ,应该有一个观察者:

watchEffect(() => {
  productStore.getProductData(route.query.id);
});

Javascript相关问答推荐

JS、C++和C#给出不同的Base 64 Guid编码结果

React:未调用useState变量在调试器的事件处理程序中不可用

使用AJX发送表单后,$_Post看起来为空

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

用JavaScript复制C#CRC 32生成器

我们如何从一个行动中分派行动

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

如何在文本字段中输入变量?

在Matter.js中添加从点A到另一个约束的约束

基于props 类型的不同props ,根据来自接口的值扩展类型

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

如何为仅有数据可用的点显示X轴标签?

Node.js错误: node 不可单击或不是元素

如何在FiRestore中的事务中使用getCountFromServer

如何在独立的Angular 应用程序中添加Lucide-Angel?

ReferenceError:无法在初始化之前访问setData

如何使用useparams从react路由中提取id

如何从Reaction-Redux中来自API调用的数据中筛选值