reactjs 如何使用use()获取和传递数据{objects}?

nfs0ujit  于 2023-03-17  发布在  React
关注(0)|答案(1)|浏览(92)
  • 使用带有Next.JS 13的React *

我尝试从API获取数据并将其传递给组件,然后组件通过它进行Map并显示。
API返回一个对象数组:

[
    {
        "category": {},
        "results": [{...}]
    }
]

我想获取的页面.tsx包含以下(简化的)结构:

import SearchResults from "./SearchResults.tsx";
import { use } from "react";

async function search() {
  let res = await fetch(`http://api:port/search`);
  return res;
}

export default function Results({ data }) {
  let searchResults = use(search());

  return <SearchResults data={searchResults} />;
}

我已经去除了类型、接口和不相关的内容。
对于组件文件,我们有:

export interface SearchResult {
  skillName: string;
  ...}

export interface Response {
  category: string;
  results: SearchResult[];
}

export interface SearchResultsProps {
  data: [];
}

const SearchResults = ({ data }: SearchResultsProps) => {
  return (
      {data.response.map((i, index) => ( 
        <div key={index}>
          <h2>{i.category}</h2>
          {i.results.map((r, resultIndex) => (
            <SearchCard
              key={`result.${index}.${resultIndex}`}
              skillName={r.skillName}
              ...
            />
          ))}
        </div>
     ))}
  );
};

export default SearchResults;

我尝试用几种不同的方法将响应绑定到data,但是组件总是声明data.results是未定义的。检查浏览器中的网络选项卡(当我将“use client”添加到代码中时)显示API返回正确的数据。我做错了什么?
PS:我用完整的文件版本做了一个pastebin,以防我剪掉一些重要的东西。

ycl3bljg

ycl3bljg1#

我使用的是应答格式,所以我解释得更好。现在您已经通过提取JSON得到了实际结果

async function search() {
  let res = await fetch(`http://api:port/search`);
  return await res.json();
}

现在,您可以根据您在评论中发布的结果绘制数据。

[ { category: { id: x, name: '...' }, results: [[Object]] }, { category: { id: y, name: '...'}, results: [[Object]] } ]

这将类似于下图

{i.map((item, index) => (
   <SearchCard
     key={index}
     skillName={item.results.skillName}
     ...
   />
))}

Map将对数组中的每一项进行操作。因此,示例中的第一个数组包含一个category和一个results键。您将从这些子对象中收集其余的数据。
我建议你去看看你的API提供的文档。他们应该能够提供更多关于数据外观的细节。有可能results没有作为有效的JSON返回,这可能是为什么它看起来像'results:Object。如果是这种情况,您将不得不与它们一起工作,或者自己解开字符串。
希望这能有所帮助!

相关问题