在 useQuery 后反应组件不重新渲染

Posted

技术标签:

【中文标题】在 useQuery 后反应组件不重新渲染【英文标题】:React component not re-rendering after useQuery 【发布时间】:2021-10-03 23:29:42 【问题描述】:

我正在使用 ApolloClint 的 useQuery 从数据库中获取数据。我遇到的问题是,我从 graphql 获得的结果似乎不会影响 useEffect 内部的依赖,因此在前端收到数据后无法重新渲染。 我有这个 React 组件:

export default function PrivateRoute(
  exact,
  path,
  component: Component,
  ...rest
: Props): ReactElement 
  let [status, setStatus] = useState(false);
  const  data, error, loading  = useQuery(GET_CURRENT_USER);

  useEffect(() => 
    data?.id && setStatus(true);
  , [data]);

  if (error) console.log(error);
  if (loading) return <Spinner></Spinner>;

  return (
    <Route
      ...rest
      render=(props) =>
        status ? (
          <>
            <Navbar></Navbar>
            <Component ...props />
          </>
        ) : (
          <Redirect
            to= pathname: "/login", state:  from: props.location  
          />
        )
      
    />
  );

我知道 useEffect 在 useQuery 完成之前触发,而不是在第一次渲染时“状态”为假,但它不应该在我放置 useEffect 依赖项后“数据”对象发生更改后重新渲染吗?

这里,我期望如果有用户(数据不是未定义),Route会返回条件的第一个选项。

但是,GraphQL 最终会返回数据,但 react 不会重新渲染。

有什么想法吗?

【问题讨论】:

【参考方案1】:

显然,如果我将渲染条件移动到 render=((props) => ...) 内,它会起作用。

export default function PrivateRoute(
  exact,
  path,
  component: Component,
  ...rest
: Props): ReactElement 
  const  data, error, loading  = useQuery(GET_CURRENT_USER);

  if (error) console.log(error);
  if (loading) return <Spinner></Spinner>;

  return (
    <Route
      ...rest
      render=(props) => 
        return data ? (
          <>
            <Navbar></Navbar>
            <Component ...props />
          </>
        ) : (
          <Redirect
            to= pathname: "/login", state:  from: props.location  
          />
        );
      
    />
  );

【讨论】:

以上是关于在 useQuery 后反应组件不重新渲染的主要内容,如果未能解决你的问题,请参考以下文章

等待反应上下文后组件不重新渲染

react-query:useQuery 返回 undefined 并且组件不会重新渲染

如何在 x 时间后重新渲染反应(突变阿波罗)

反应父组件不重新渲染

将新的商店状态放入道具后,反应不会重新渲染

如何在反应中限制经常重新渲染的组件