无法循环遍历 Vue 3 Reactive Array prop(代理)

Jam*_*nna 6 vue.js vue-component vue-reactivity vuejs3 vue-composition-api

任务

我正在开发一个产品市场。每个产品都有一个 ID 和一系列与每个产品相关的信息。

有一个产品包的概念,简单地说就是一个产品是其他产品的捆绑。

在 GET PACKAGES 响应中,有一组与此包内的产品相关的 ID。在页面的其他位置,我请求产品列表,因此我已经有了所需的数据,我只需要连接两个数据集。

该任务涉及在 UI 中显示包以及每个产品的描述(位于 GET PRODUCTS 的另一个响应中),该描述通过两个数据集之间的 ID 连接。

设置说明

我有一个父组件,它调用“获取产品”和“获取包”。

我将包传递给可重用的 Vue 组件,以在 UI 中显示该包的基本信息。除此之外,我还将所有产品传递给组件,以便我们可以获得正确的产品描述以显示在包 UI 的预览中。

问题

当将产品列表传递到子组件时,我可以完美地控制台记录整个产品数组,但是当我尝试循环它们(通过 MAP 或 FOREACH)时,什么也没有发生。循环内没有控制台日志;就像循环根本没有运行一样。

父组件代码

<package 
    v-for="package in packages" 
    :key="package.id"
    :packages="package"
    :products="products"
></package>

// I get both sets of data in beforeOnMount and push it to the below variables
const packages = reactive<Array<Package>>([]);
const products = reactive<Array<Product>>([]);
Run Code Online (Sandbox Code Playgroud)

子组件代码

props: {
    packages: Object as () => Package,
    products: Object as () => Array<Product>
}

setup(props) {
    const uiPackages= reactive<Array<IPackageDetails>>([]);
    const productData = props.products;

    // This console log's a Proxy, with the handler containing an array of objects perfectly fine.
    console.log(productData);

    if (productData) {

        // This console log's undefined
        console.log(productData[0]);

        productData.forEach((product) => {

            // This does NOTHING in console!
            console.log(product)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

子组件中productData的控制台日志

由于 NDA 数据模糊的产品

Dan*_*Dan 6

当子组件初始化时,productsprop 仍然是一个空数组。您在控制台中看到数据的原因是因为当您单击它时控制台会自行更新,并且此时父级的异步请求已完成。

这只发生在引用中,因此当您记录它时,您看不到product[0]没有引用的单个数组项。

在 prop 上使用watch(或watchEffect) 来等待获取项目:

setup(props) {
  const productData = props.products;

  watch(() => productData.length, () => {
    productData.forEach((item) => {
      console.log(item)
    })
  })
}
Run Code Online (Sandbox Code Playgroud)

v-if或者,您可以在父级中使用 a :

<template v-if="packages.length && products.length">
  <package 
    v-for="package in packages" 
    :key="package.id"
    :packages="package"
    :products="products"
  ></package>
</template>
Run Code Online (Sandbox Code Playgroud)