reactjs 有没有办法解决这个“undefined不是对象(evaluating 'data.products.map')"?

zbq4xfa0  于 2023-04-05  发布在  React
关注(0)|答案(2)|浏览(130)

My React App通过下面的api.js文件从Djano REST API中提取数据。

API.js

const URLS = {

  PRODUCTS: "http://127.0.0.1:8000/api/products/",
  PRODUCT: (id) => `http://127.0.0.1:8000/api/products/${id}`,

};

const wrappedFetch = (...args) => {
  return fetch(...args).then((res) => {
    return res.json();
  });
};

const get = (url) => wrappedFetch(url);

// PRODUCT API
const loadProducts = () => get(URLS.PRODUCTS);
const loadProduct = (id) => get(URLS.PRODUCT(id));

export {

  loadProducts,
  loadProduct,

};

数据在第一次加载时没有成功呈现,并在下面的useAllProducts.js文件中发现了一个问题。

import { useQuery } from "react-query";
import { loadProducts } from "./api/api";

function useAllProducts() {
  const { data = [] } = useQuery("products", loadProducts);
  console.log(data)
 
  return data.products.map(({ id }) => id);
}

export default useAllProducts;

错误为undefined is not an object (evaluating 'data.products.map')
useAllProduts.js中,一旦我将return data.products.map(({ id }) => id);更改为return data.map(({ id }) => id);,然后再次更改为return data.products.map(({ id }) => id);,产品就可以成功呈现。
将上述内容替换为
return data.products && products.map(({ id }) => id);
不能解决错误。
刷新页面时,同样的错误仍然存在(undefined is not an object (evaluating 'data.products.map')。我认为我的应用在填充数据之前呈现了数据,可能需要在我的API.js中添加条件或async/await。
如何解决这个问题:我尝试添加async/await,但我觉得我犯了个错误,因此没有工作。
我知道有类似的问题,但我的API文件是完全不同的。
请帮帮我。

4xrmg8kj

4xrmg8kj1#

return data.products && products.map(({ id }) => id);不正确,因为productsproducts.map中未定义。您可能希望执行类似return data.products && data.products.map(({ id }) => id);的操作。
在初始渲染时,数据尚未被获取(和缓存data.products是未定义的。当您将代码更改为data.map(({ id }) => id);并返回并工作时,很可能钩子能够读取缓存的响应并定义了data.products
如果你期望获取的数据有一个products属性,即数组,那么你可以提供一个更好的回退值,并对可能未定义的属性访问使用null检查。
示例:

function useAllProducts() {
  const { data = { products: [] } } = useQuery("products", loadProducts);
 
  return (data.products ?? []).map(({ id }) => id);
}
function useAllProducts() {
  const { data } = useQuery("products", loadProducts);
 
  return (data?.products ?? []).map(({ id }) => id);
}
1mrurvl1

1mrurvl12#

import { useQuery } from "react-query";
import { loadProducts } from "./api/api";

function useAllProducts() {
  const { data = [] } = useQuery("products", loadProducts);
  console.log(data)
 
  return data.products ? data.products.map(({ id }) => id) :[];
}

export default useAllProducts;

相关问题