【问题标题】:How can I tell ApolloClient to refetch a specific query and rerender the component?如何告诉 ApolloClient 重新获取特定查询并重新呈现组件?
【发布时间】:2021-08-31 23:18:58
【问题描述】:

我是使用 ApolloClient 的新手,如果这是一个不好的问题,我很抱歉,但我真的需要一些帮助。我习惯使用 Redux 和基于类的组件,将 Apollo 与功能组件和钩子一起使用对我来说很新,我什至不知道如何做最简单的事情。

现在我正在尝试实现一个身份验证系统。我有发送用户凭据并接收身份验证令牌的查询。我有一个标题,它是与注册/登录表单分开的组件,它显示登录或注销按钮。它使用一个查询将身份验证令牌发送到受保护的路由,并接收回用户信息(如用户名)。

我的任务非常简单——一旦单击“注销”按钮,我希望重新获取获取用户信息的查询,并重新呈现标题组件,以便它显示的不是“注销”按钮而是“登录”按钮。

我是这样做的:

export default function Header() {
  const { data, refetch } = useQuery(USER_INFO)
  function logout() {
    cookieCutter.set("Authorization", "", { expires: new Date(0) })
    refetch()
  }
  return (
    <header>
      [...]
      // If there's user info inside of data, render logout button, otherwise render login button.
      <a onClick={logout}>
        Logout
      </a>
      [...]
    </header>
  )
}

所以我试图删除 auth cookie,然后重新获取查询。我希望运行refetch() 函数将重新获取查询,这将返回空的data 对象(因为不再有任何身份验证令牌),并重新渲染组件以现在显示“登录”按钮。

但是当我只是单击“注销”按钮时,组件不会重新呈现。如果我手动刷新页面,它会看到没有令牌,并按预期呈现“注销”按钮。

我觉得必须有一个简单而标准的方法来做这样的事情,但我不知道那是什么。你能帮帮我吗?

(我知道您可以将 refetchQueries 参数传递给突变,但它不适用于此处)。

【问题讨论】:

标签: reactjs graphql apollo apollo-client


【解决方案1】:

如果你使用 Apollo,你就不需要 Redux。

有关身份验证,请查看this

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 2021-11-23
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2019-11-30
    • 2017-03-20
    • 2018-01-09
    • 2021-01-27
    相关资源
    最近更新 更多