【问题标题】:Typescript fetch data from server and loading stateTypescript 从服务器获取数据并加载状态
【发布时间】:2021-09-01 04:06:18
【问题描述】:

我对打字稿很陌生,不知道如何最好地处理这种相当常见的情况。我获取数据并将其传递给模板组件:

const ProfilePage: FC = (): JSX.Element => {
  const { data, isDataLoading } = useProfileData();

  return (
    <ProfileTemplate
      data={!isDataLoading && data}
    />
  );
};

这是ProfileTemplate 组件

import { profile_data, Maybe } from '../api-client';

type ProfileProps = {
  data: Maybe<profile_data>;
}

export const ProfileTemplate: FC<ProfileProps> = ({ data }): JSX.Element => {
  ...
  <StaticField label="First Name" text={data.first_name} />
  <StaticField label="Last Name" text={data.last_name} />
  ...
}

这样调用它会导致类型 'false | Maybe&lt;profile&gt;' is not assignable to type 'Maybe&lt;profile&gt;'. 我可以删除首先检查 isDataLoading 的条件,但是然后我的 &lt;StaticField&gt; 组件中会出现 object is possibly null 错误。

first_namelast_name 在数据库中可以为空或为空。虽然我意识到这不是导致object is possibly null 错误的原因,而是一个空的profile_data 对象,当时还没有从服务器返回数据。

我应该如何最好地处理这种情况?

My `<StaticField>` component looks like so: interface Props {
  label: string;
  text?: Maybe<string>;
}

export const StaticField: FunctionComponent<Props> = ({ label, text }): JSX.Element => {
  return (
    <Box>
      <Text color="gray.BlackCoral" className={classes.label}>
        {label}
      </Text>
      <Text>{text}</Text>
    </Box>
  );
};

【问题讨论】:

  • 您的useProfileData 中有什么内容?

标签: reactjs typescript react-hooks


【解决方案1】:

你应该这样处理以确保ProfileTemplate 总是有data

{
  !isDataLoading && <ProfileTemplate data={data} />;
}

【讨论】:

  • 非常感谢!这不太理想,因为函数需要返回一些东西。不过谢谢分享。
【解决方案2】:

这行是问题

  data={!isDataLoading && data}

我建议你重构你的代码以像这样进行条件渲染

if (isDataLoading || !data) {
    return null
}
return (
    <ProfileTemplate data={data}/>
);

但是,您可以简单地将 data 属性替换为三元 提取到常量中总是一个好习惯

const data = isDataLoading ? data : undefined;
return (
    <ProfileTemplate data={data}/>
);

第二个选项仍然没有考虑当你有未定义的数据时应该呈现什么 所以你需要在 ProfileTemplate 中渲染 null

【讨论】:

  • 非常感谢!绝对是我想要的。
【解决方案3】:

如果我理解正确的话,Maybe 似乎被定义为 type Maybe&lt;T&gt; = T | null

所以,既然您希望data 存在或null,您可以将您的消费逻辑更改为

<ProfileTemplate
  data={isDataLoading ? null : data}
/>

这将消除错误'false | Maybe&lt;profile&gt;' is not assignable to type 'Maybe&lt;profile&gt;'.。出现此错误是因为在您现有的代码中 !isDataLoading &amp;&amp; data 可以评估为 falsedata 的任何类型。

其次,由于data 可以是null,使用它来访问data.first_name 可能是个问题。这就是 TypeScript 试图告诉你的。 “修复”它的一种方法是使用可选链接data?.first_name 告诉编译器您将访问first_name iff data 已定义。

【讨论】:

  • 太棒了,谢谢。我添加了可选链接...然后在我的 组件中,我应该将text 键入为Maybe&lt;string&gt; 吗?仅string 就会出错,但在这种情况下是否有任何理由不使用Maybe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2016-10-31
  • 2017-04-26
  • 1970-01-01
  • 2011-07-16
  • 2014-06-18
  • 2020-09-08
相关资源
最近更新 更多