变异后如何强制App重新渲染?

拉伸0

我有一个使用 Next.js 构建的 React 应用程序。我希望能够登录然后使应用程序重新呈现,以便它尝试获取当前登录的用户。

我的_app.js组件与 apollo 提供程序包装在一起,并且还有一个获取用户查询:

class MyApp extends App {

  render() {
    const { Component, pageProps, apolloClient } = this.props;
    return (
      <>
        <Container>
          <ApolloProvider client={apolloClient}>
            <Query query={GET_USER} fetchPolicy="network-only" errorPolicy="ignore">
              {({ loading, data, error }) => console.log("rendering app", data) || (
                <>
                  <Component {...pageProps} user={data && data.me} />
                </>
              )}
            </Query>
          </ApolloProvider>
        </Container>
      </>
    );
  }
}

然后我有一个登录表单,它只是将电子邮件和密码发送到我的 API,然后返回一个带有访问令牌的 set-cookie 令牌标头。

<Mutation 
    mutation={LOGIN}
    onError={error => {
        this.setState({error: "Incorrect email or password"})
    }}
    onCompleted={() => {
        window.location.reload() // temp solution to cause app to re-render
    }}
>
  {(login, {loading}) => (
    <Login 
        {...this.props} 
        login={login} 
        loading={loading} 
        error={error} 
    />
  )}
</Mutation>

我可以成功登录,但我希望 Apollo 缓存能够与用户数据一起写入:

{
  "data": {
    "login": {
      "_id": "abcd1234",
      "accessToken": "abc123",
      "firstName": "First",
      "lastName": "Last",
      "email": "[email protected]",
      "__typename": "User"
    }
  }
}

随着缓存被写入,我期待 _app.js / ApolloProvider 子节点在从缓存接收道具时重新渲染。

我的 get user Query 然后应该尝试再次运行(这次使用在 cookie 中设置的访问令牌)并且应该返回一个用户(表明用户已登录)。

为什么我的突变没有告诉我的应用程序重新渲染 onCompleted?

沼泽

这是完美的场景refetchQueries()https : //www.apollographql.com/docs/angular/features/cache-updates/#refetchqueries

在您的场景中,您可以将此道具传递给您的登录变异组件以GET_USER在登录后重新获取查询。GET USER从您的_app.js(或将其移动到的任何地方,如果您将其放入 User Hoc 中)导出然后在您的登录突变中:

import { GET_USER } from '...'

<Mutation 
    mutation={LOGIN}
    onError={error => {
        this.setState({error: "Incorrect email or password"})
    }}
    onCompleted={() => {
        window.location.reload() // temp solution to cause app to re-render
    }}
    // takes an array of queries to refetch after the mutation is complete
    refetchQueries={[{ query: GET_USER }]} 
>
  {(login, {loading}) => (
    <Login 
        {...this.props} 
        login={login} 
        loading={loading} 
        error={error} 
    />
  )}
</Mutation>

另一种选择是使用该update方法手动将其设置到缓存中,然后保留对该数据的引用或使用缓存 id 从缓存中检索它,这样您就不必获取更多数据,但refetchQueries对于简单来说,这是完美的像这样的登录突变检索起来并不昂贵。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改道具后,如何在Svelte中强制重新渲染?

来自分类Dev

重新渲染当前页面后,Rails绕过javascript:如何强制执行GET请求?

来自分类Dev

如何强制 React 组件重新渲染?

来自分类Dev

强制重新渲染后解决的Vuetify数据表错误

来自分类Dev

强制重新渲染组件

来自分类Dev

单击后如何立即重新渲染?

来自分类Dev

如何强制 Polymer 重新渲染表而不更改集合

来自分类Dev

使用A4J,如何重新渲染javascript函数,并在重新渲染后调用它?

来自分类Dev

如何在Aurelia中强制进行绑定重新评估或重新渲染

来自分类Dev

部署后如何强制客户端重新加载?

来自分类Dev

在错误强制停止后如何使程序重新启动?

来自分类Dev

更新请求后如何触发useEffect重新渲染

来自分类Dev

在Svelte中从数组删除对象后,如何重新渲染视图?

来自分类Dev

如何在事件接收后重新渲染 Wicket 组件

来自分类Dev

关闭后重新渲染视图

来自分类Dev

部分功能后重新渲染

来自分类Dev

MobX:分配后重新渲染

来自分类Dev

如何强制以编程方式重新加载Capacitor App

来自分类Dev

流星:强制重新渲染嵌套的模板

来自分类Dev

强制ng-include重新渲染

来自分类Dev

强制反应功能组件触发重新渲染

来自分类Dev

如何在初始渲染/重新渲染后根据 DOM 节点信息设置状态?(反应)

来自分类Dev

Dojo2 如何强制 dojo 2 小部件重新渲染?

来自分类Dev

如何强制从另一个组件重新渲染一个 Vue 组件

来自分类Dev

用户登录后流星重新渲染模板

来自分类Dev

重新渲染模板后的流星回调

来自分类Dev

在AJAX请求后重新渲染React组件

来自分类Dev

状态更改后从子组件重新渲染

来自分类Dev

反应:单击按钮后重新渲染组件

Related 相关文章

  1. 1

    更改道具后,如何在Svelte中强制重新渲染?

  2. 2

    重新渲染当前页面后,Rails绕过javascript:如何强制执行GET请求?

  3. 3

    如何强制 React 组件重新渲染?

  4. 4

    强制重新渲染后解决的Vuetify数据表错误

  5. 5

    强制重新渲染组件

  6. 6

    单击后如何立即重新渲染?

  7. 7

    如何强制 Polymer 重新渲染表而不更改集合

  8. 8

    使用A4J,如何重新渲染javascript函数,并在重新渲染后调用它?

  9. 9

    如何在Aurelia中强制进行绑定重新评估或重新渲染

  10. 10

    部署后如何强制客户端重新加载?

  11. 11

    在错误强制停止后如何使程序重新启动?

  12. 12

    更新请求后如何触发useEffect重新渲染

  13. 13

    在Svelte中从数组删除对象后,如何重新渲染视图?

  14. 14

    如何在事件接收后重新渲染 Wicket 组件

  15. 15

    关闭后重新渲染视图

  16. 16

    部分功能后重新渲染

  17. 17

    MobX:分配后重新渲染

  18. 18

    如何强制以编程方式重新加载Capacitor App

  19. 19

    流星:强制重新渲染嵌套的模板

  20. 20

    强制ng-include重新渲染

  21. 21

    强制反应功能组件触发重新渲染

  22. 22

    如何在初始渲染/重新渲染后根据 DOM 节点信息设置状态?(反应)

  23. 23

    Dojo2 如何强制 dojo 2 小部件重新渲染?

  24. 24

    如何强制从另一个组件重新渲染一个 Vue 组件

  25. 25

    用户登录后流星重新渲染模板

  26. 26

    重新渲染模板后的流星回调

  27. 27

    在AJAX请求后重新渲染React组件

  28. 28

    状态更改后从子组件重新渲染

  29. 29

    反应:单击按钮后重新渲染组件

热门标签

归档