登录状态不会在 React、Apollo Client 2、Graphcool 中被动更新

Posted

技术标签:

【中文标题】登录状态不会在 React、Apollo Client 2、Graphcool 中被动更新【英文标题】:Logged in state doesn't reactively update in React, Apollo Client 2, Graphcool 【发布时间】:2018-07-07 06:15:55 【问题描述】:

我正在使用 React、Apollo Client 2 和 Graphcool。我已经实现了一个登录表单。根据客户端登录的天气,在登录页面上会显示登录表单或注销按钮。

我的代码可以工作,但不会响应式更新。用户登录或注销后,在刷新页面之前没有任何变化。如何使我的代码具有反应性?

import React from 'react';
import  graphql, compose  from 'react-apollo';
import gql from 'graphql-tag';

class Login extends React.Component 
    constructor(props) 
        super(props);
        this._confirm = this._confirm.bind(this);
    

    _confirm = async e => 
        e.preventDefault();

        const result = await this.props.LoginMutation(
            variables: 
                email: '5@gmail.com',
                password: 'password',
            ,
        );

        const token = result.data.authenticateUser.token;
        this._saveUserData(token);
    ;

    _saveUserData = token => 
        localStorage.setItem('auth-token', token);
    ;

    render() 
        return (
            <div>
                this.props.LoginQuery.user ? (
                    <button onClick=() => localStorage.removeItem('auth-token')>
                        Logout
                    </button>
                ) : (
                    <form onSubmit=this._confirm>
                        <input type="email" id="email" />
                        <input type="password" id="password" />
                        <button type="submit">Login</button>
                    </form>
                )
            </div>
        );
    


const LoginMutation = gql`
    mutation authenticateUser($email: String!, $password: String!) 
        authenticateUser(email: $email, password: $password) 
            token
        
    
`;

const LoginQuery = gql`
    query AppQuery 
        user 
            id
        
    
`;

const LoginContainer = compose(
    graphql(LoginMutation,  name: 'LoginMutation' ),
    graphql(LoginQuery,  name: 'LoginQuery' ),
)(Login);

export default LoginContainer;

【问题讨论】:

【参考方案1】:

与 UI 有关的任何内容都不一定需要受到保护。因此,您可以轻松地使用状态或数据存储(例如 redux、mobx 等)来触发 UI 更新。

如果您希望基于 GraphQL 的突变对 UI 进行响应式更新。老实说,我会建议实施订阅,这将为您提供您正在寻找的那种反应式数据流。

Subscriptions ~ Apollo Client

【讨论】:

以上是关于登录状态不会在 React、Apollo Client 2、Graphcool 中被动更新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React Apollo 客户端处理 HTTP 状态错误

写入缓存时,Apollo 客户端链接状态“ 中缺少字段”?

Apollo 链接状态与内置 React 状态

将数据从客户端添加到 Apollo?

React Apollo 和 Redux:将自定义 reducer 与 Apollo 状态相结合

在 react-apollo 的 Query 组件中设置状态