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

React自定义Hook返回数据报错:无法解构campaigns

问题分析与解决方案

你的核心问题是自定义Hook的返回值类型不一致:当campaigns未加载完成时返回<Spinner />组件(React元素),加载完成后返回包含campaigns的对象。这种情况下,当你尝试解构campaigns时,如果Hook返回的是Spinner元素,就会因为无法从React元素上解构出campaigns属性而报错。

正确的实现方式

React自定义Hook的返回值应该保持类型统一,通常我们会把加载状态、数据、错误等信息一起返回,组件渲染逻辑放在调用Hook的组件中,而非Hook内部。

修改你的useCreateActivity Hook:

export function useCreateActivity() {
  const { data: campaigns, isLoading, error } = trpc.campaign.getCampaigns.useQuery();

  // 返回统一结构的对象,包含加载状态、数据、错误
  return {
    campaigns,
    isLoading,
    error,
  };
}

在组件中使用Hook

import { Spinner } from './Spinner';
import { useCreateActivity } from './useCreateActivity';

function YourComponent() {
  const { campaigns, isLoading, error } = useCreateActivity();

  if (isLoading) {
    return <Spinner />;
  }

  if (error) {
    return <div>加载失败:{error.message}</div>;
  }

  // 这里可以安全地使用campaigns
  return (
    <div>
      {campaigns.map(campaign => (
        <div key={campaign.id}>{campaign.name}</div>
      ))}
    </div>
  );
}

原写法报错原因

当campaigns不存在时,你的Hook返回的是<Spinner />(一个React元素对象,结构类似{ type: 'div', props: {}, ... }),此时你尝试解构const { campaigns } = useCreateActivity(),相当于从Spinner元素上取campaigns属性,自然得到undefined,如果后续代码直接使用这个undefined的campaigns(比如调用map方法),就会抛出Cannot read properties of undefined的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:30