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

如何获取Fetch响应首个元素的值(Gatsby场景)

获取Fetch请求返回数据的首个元素并在Gatsby中传递值

一、获取返回数据的首个元素

你的代码中已经通过setData(data.value)将接口返回的数组存入状态变量data,但data初始值为null,直接访问data[0]会触发报错,需要先做存在性判断:

方式1:使用可选链操作符(推荐)

// 在组件函数内部,状态变量data声明后
const firstRezept = data?.[0];
const aenderungsdatum = firstRezept?.aenderungsdatum;

可选链?.会自动判断左侧值是否为null/undefined,避免报错。

方式2:条件判断

// 可以在useEffect或者组件渲染逻辑中处理
if (data && data.length > 0) {
  const firstRezept = data[0];
  const aenderungsdatum = firstRezept.aenderungsdatum;
  // 这里可以执行赋值、状态更新等操作
}

另外注意:你的fetch请求没有传入abortCont.signal,导致无法正常中止请求,需要修改fetch调用:

fetch(
  `https://abc.4.azurestaticapps.net/data-api/rest/Rezept?$filter=RezeptId eq ${url_id}`,
  { signal: abortCont.signal } // 新增这一行
)

二、在Gatsby中传递值到其他页面

根据场景不同,有三种常用方案:

1. 通过路由状态传递(无URL暴露)

使用Gatsby的Link组件跳转时,将数据存入state对象:

import { Link } from 'gatsby';

// 在ListRezept组件中,确保data存在时渲染跳转链接
{data && data.length > 0 && (
  <Link
    to={{
      pathname: '/目标页面路径',
      state: {
        aenderungsdatum: data[0].aenderungsdatum,
        fullItem: data[0] // 也可以传递整个元素
      }
    }}
  >
    跳转到详情页
  </Link>
)}

在目标页面通过useLocation获取状态:

import { useLocation } from '@reach/router';

const TargetPage = () => {
  const location = useLocation();
  const { aenderungsdatum, fullItem } = location.state || {};

  return (
    <div>
      <p>修改日期:{aenderungsdatum}</p>
    </div>
  );
};

export default TargetPage;

2. 通过全局Context共享(多页面/组件共享)

如果需要在多个页面或组件中复用该数据,可以创建全局Context:

第一步:创建Context文件

// src/context/RezeptContext.js
import { createContext, useContext, useState } from 'react';

const RezeptContext = createContext();

export const RezeptProvider = ({ children }) => {
  const [selectedRezept, setSelectedRezept] = useState(null);

  return (
    <RezeptContext.Provider value={{ selectedRezept, setSelectedRezept }}>
      {children}
    </RezeptContext.Provider>
  );
};

export const useRezeptContext = () => useContext(RezeptContext);

第二步:在根组件包裹Provider

在gatsby-browser.js和gatsby-ssr.js中添加:

import { RezeptProvider } from './src/context/RezeptContext';

export const wrapRootElement = ({ element }) => {
  return <RezeptProvider>{element}</RezeptProvider>;
};

第三步:在ListRezept中设置数据

import { useRezeptContext } from '../context/RezeptContext';

const ListRezept = (props) => {
  const { setSelectedRezept } = useRezeptContext();
  // ... 其他状态和逻辑

  useEffect(() => {
    if (data && data.length > 0) {
      setSelectedRezept(data[0]);
    }
  }, [data, setSelectedRezept]);

  // ... 渲染逻辑
};

第四步:在目标页面获取数据

import { useRezeptContext } from '../context/RezeptContext';

const TargetPage = () => {
  const { selectedRezept } = useRezeptContext();

  return (
    <div>
      <p>修改日期:{selectedRezept?.aenderungsdatum}</p>
    </div>
  );
};

3. 通过URL查询参数传递(URL可见)

如果需要参数在URL中展示,可以拼接查询参数:

import { Link } from 'gatsby';

{data && data.length > 0 && (
  <Link
    to={`/目标页面路径?aenderungsdatum=${data[0].aenderungsdatum}`}
  >
    跳转到详情页
  </Link>
)}

在目标页面解析查询参数:

import { useLocation } from '@reach/router';
import queryString from 'query-string'; // 需要先安装:npm install query-string

const TargetPage = () => {
  const location = useLocation();
  const { aenderungsdatum } = queryString.parse(location.search);

  return <p>修改日期:{aenderungsdatum}</p>;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:05:14