You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React访问WordPress GraphQL嵌套数组yarnFiber返回undefined求助

嵌套数组值访问问题:React + GraphQL/Apollo 获取WordPress数据

我是React新手,正在开发一款使用GraphQL和Apollo从WordPress获取数据的应用,目前卡在嵌套数组值访问问题上。我可以通过{yarn?.yarnFields?.yarnPrice}语法获取其他字段值,但访问yarnFiber的name字段时返回undefined,且yarnFiber数组可能包含多个值,需要正确获取并展示。


控制台打印的数据结构

{__typename: 'Yarn', name: 'Brick Red', yarnFields: {…}}
name: "Brick Red"
yarnFields:
yarnColor: "#cb4154"
yarnFiber: Array(1)
0: {__typename: 'Fiber', name: 'Merino'}
length: 1
[[Prototype]]: Array(0)
yarnPrice: 6.5
__typename: "Yarn_Yarnfields"
[[Prototype]]: Object
__typename: "Yarn"
[[Prototype]]: Object

GraphQL返回的数据结构

{
  "data": {
    "yarns": {
      "nodes": [
        {
          "name": "Brick Red",
          "id": "dGVybToyNTI=",
          "yarnFields": {
            "yarnColor": "#cb4154",
            "yarnPrice": 6.5,
            "yarnFiber": [
              {
                "name": "Merino"
              }
            ]
          }
        },
        {
          "name": "Burgundy",
          "id": "dGVybToyNzg=",
          "yarnFields": {
            "yarnColor": "#662d40",
            "yarnPrice": 9.11,
            "yarnFiber": null
          }
        },
        {
          "name": "Cobalt Blue",
          "id": "dGVybToyOTQ=",
          "yarnFields": {
            "yarnColor": "#1664af",
            "yarnPrice": 7.54,
            "yarnFiber": null
          }
        }
      ]
    }
  }
}

当前代码

JSX遍历代码

const { loading, error, data } = useQuery(YARNS_QUERY);
if (isEmpty(data)) {
  return null;
}

if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;

return (
  <>
    {data.yarns.nodes.map((yarn, i) => (
      <DK key={i} yarn={yarn}/>
    ))} 
  </>
);

展示组件代码

return (
  <div>
    <div onClick={change} 
        data-color={yarn?.name}
        data-price={yarn?.yarnFields?.yarnPrice}
        data-fiber={yarn?.yarnFields?.yarnFiber?.name}
        style={{
            background: yarn?.yarnFields?.yarnColor, 
            width: '50px', 
            height: '50px', 
            borderRadius: '50%'}}>
      fiber: {yarn.yarnFields?.yarnFiber?.name} // 返回空值
    </div>
  </div>
);

补充说明

yarnFiber数组可能包含多个值,示例:

{
  "name": "Burgundy",
  "id": "dGVybToyNzg=",
  "yarnFields": {
    "yarnColor": "#662d40",
    "yarnPrice": 9.11,
    "yarnFiber": [
      {
        "name": "Merino Wool"
      },
      {
        "name": "Silk"
      },
      {
        "name": "Cashmere"
      }
    ]
  }
}

解决方案

问题核心是yarnFiber是数组类型,不是单个对象,所以不能直接用.name访问。以下是几种处理方式:

1. 展示所有纤维名称(逗号分隔)

如果需要把所有纤维名称用逗号拼接展示:

// 提取纤维名称列表,处理null/空数组情况
const fiberNames = yarn?.yarnFields?.yarnFiber?.map(fiber => fiber.name) || [];
// 转成字符串,空数组时显示默认文本
const fiberText = fiberNames.length > 0 ? fiberNames.join(', ') : '无纤维信息';

替换展示组件中的对应代码:

<div onClick={change} 
     data-color={yarn?.name}
     data-price={yarn?.yarnFields?.yarnPrice}
     data-fiber={fiberText}
     style={{
         background: yarn?.yarnFields?.yarnColor, 
         width: '50px', 
         height: '50px', 
         borderRadius: '50%'}}>
  fiber: {fiberText}
</div>

2. 只展示第一个纤维名称

如果只需要显示数组中的第一个纤维名称:

const firstFiberName = yarn?.yarnFields?.yarnFiber?.[0]?.name || '无纤维信息';

替换对应位置代码:

<div onClick={change} 
     data-color={yarn?.name}
     data-price={yarn?.yarnFields?.yarnPrice}
     data-fiber={firstFiberName}
     style={{
         background: yarn?.yarnFields?.yarnColor, 
         width: '50px', 
         height: '50px', 
         borderRadius: '50%'}}>
  fiber: {firstFiberName}
</div>

3. 单独渲染每个纤维名称

如果需要把每个纤维名称作为独立元素展示:

<div onClick={change} 
     data-color={yarn?.name}
     data-price={yarn?.yarnFields?.yarnPrice}
     style={{
         background: yarn?.yarnFields?.yarnColor, 
         width: '50px', 
         height: '50px', 
         borderRadius: '50%'}}>
  <div>fiber:</div>
  {yarn?.yarnFields?.yarnFiber?.map((fiber, index) => (
    <span key={index}>{fiber.name}</span>
  )) || <span>无纤维信息</span>}
</div>

内容的提问来源于stack exchange,提问作者user19910578

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:57:38