apollo usequery 导致未定义的错误

Posted

技术标签:

【中文标题】apollo usequery 导致未定义的错误【英文标题】:apollo usequery causes undefined errors 【发布时间】:2021-10-27 11:19:11 【问题描述】:

我有一个相当简单的组件:

import useQuery from '@apollo/react-hooks';
import resolvers from '../../resolvers';

const DashboardComponent = () => 
  const data = useQuery(resolvers.ReturnAllMovies);
  const movies = data?.movies;

  return (
    <React.Fragment>
      <DashboardMovieOverviewMenu />
       movies?.length > 0 ? <MovieOverview /> : null 
    </React.Fragment>
  );
;

export default DashboardComponent;

这里的问题是usequery 两次加载组件,但第一次加载时data 未定义。因此,如果要检查 const movies 中是否有任何电影,我会收到 movies 未定义的错误。这是有道理的,因为数据尚未加载。我使用? 语法进行空检查解决了这个问题,但必须有更简单的方法对吧?或者我应该检查每个组件中的加载是否为真/假?

【问题讨论】:

如果你只想渲染一个空列表而不需要很多检查,设置合理的默认值:const data: movies = [] = = useQuery。现在movies 可以立即作为数组使用。 【参考方案1】:

您可以使用loading。在进行 API 调用时,数据将是 undefined。和loading 设置为true。这在不添加optional chaining(?) 的情况下有效。但建议保留?

import useQuery from '@apollo/react-hooks';
import resolvers from '../../resolvers';

const DashboardComponent = () => 
  const data, loading  = useQuery(resolvers.ReturnAllMovies);
  if(loading)
   return "Loading...";
  
  const movies = data.movies;

  return (
    <React.Fragment>
      <DashboardMovieOverviewMenu />
       movies?.length > 0 ? <MovieOverview /> : null 
    </React.Fragment>
  );
;

export default DashboardComponent;

此文档清楚地解释了如何处理加载和错误情况 -> executing-a-query

【讨论】:

这很烦人。 @PeterBoomsma 只是不同的状态及时data 开始时未定义,加载后可用(下一次渲染) - 文档/tuts 中有明确说明 我明白这一点,但仍然很烦人,您必须进行空值检查等才能捕获它。 不需要空值检查 - 只是数据就绪检查(!loadingif(data)data &amp;&amp;

以上是关于apollo usequery 导致未定义的错误的主要内容,如果未能解决你的问题,请参考以下文章

useQuery 返回未定义,但在 gql 操场上返回数据

在api请求准备好之前无法弄清楚如何跳过查询,因此它不会在带有useSWR的apollo useQuery中返回未定义的变量

使用 useQuery 进行批处理反应钩子返回未定义

当来自 Apollo useQuery 挂钩的“数据”返回 useMemo 所依赖的“数据”的新值时,useMemo 未运行

如何在 GraphQL 中正确链接 useQuery 和 useMutation?

如何正确地将变量传递给 apollo useQuery?