函数外的 React-Apollo 突变数据?

Posted

技术标签:

【中文标题】函数外的 React-Apollo 突变数据?【英文标题】:React-Apollo mutation data outside the function? 【发布时间】:2019-10-24 04:12:32 【问题描述】:

我有以下突变

<Mutation mutation=LOGIN>
     (login, data,loading,error) => 
        if(loading)  return(<h1> Loading... </h1>);
        return(
            <button onClick=
                e => 
                e.preventDefault();
                    login(
                        variables: 
                            email: this.state.email,
                            password: this.state.password
                        
                    ).then(() => this.context.login(
                        data.login.token, 
                        data.login.userId, 
                        data.login.tokenExpiration))
                >
                Login
            </button>
        );
    
</Mutation>

你可以看到,我调用了登录方法 onClick 并且在我使用了.then 块之后,它会抛出一个错误,因为上面突变中的data 对象是未定义的,我该如何传递这些数据或制作它在突变功能之外可用吗?或者也许通过道具传递它们?

【问题讨论】:

【参考方案1】:

您可以创建一个event handler 并像这样传递参数:

handleClick(event, login , data) 
    event.preventDefault();
    login(
       variables: 
          email: this.state.email,
          password: this.state.password
       
    ).then(() => this.context.login(
      data.login.token, 
      data.login.userId, 
      data.login.tokenExpiration
    ))


...

render() 
  return(
    <Mutation mutation=LOGIN>
     (login, loading,error,data) => 
        if(loading)  return(<h1> Loading... </h1>);
        if(error) return(<p>`Error : $error`</p>);
        return(
         <button onClick=e => this.handleClick(e, login, data)>
           Login
         </button>
        );
    
    </Mutation>
  )

【讨论】:

如果我这样做,它会是同样的事情。此外,如果我 console.log 它,数据将是未定义的【参考方案2】:

为什么不直接使用三元运算符来显示数据呢?

<Mutation mutation=LOGIN>
     (login, data,loading,error) => 
        if(loading)  return(<h1> Loading... </h1>);
        return(
            <button onClick=
                e => 
                e.preventDefault();
                    login(
                        variables: 
                            email: this.state.email,
                            password: this.state.password
                        
                    )

                       data && () => this.context.login(
                        data.login.token, 
                        data.login.userId, 
                        data.login.tokenExpiration) 
                >
                Login
            </button>
        );
    
</Mutation>

也许在您的情况下,您不应该使用突变组件,而是使用 graphql hoc 才能使用 then 语法。

【讨论】:

【参考方案3】:

默认情况下,突变的响应会在突变承诺中返回,因此您可以使用它而不是尝试在突变结果中使用data

login(
  variables: 
    email: this.state.email,
    password: this.state.password
  
).then(response => 
  this.context.login(
    response.data.login.token, 
    response.data.login.userId, 
    response.data.login.tokenExpiration
  );
)

【讨论】:

以上是关于函数外的 React-Apollo 突变数据?的主要内容,如果未能解决你的问题,请参考以下文章

react-apollo 突变组件将空字符串发送为 null

react-apollo 突变不会重新获取

使用带有反应生命周期方法的 react-apollo 2.1 突变

未捕获的错误:react-apollo 仅支持每个 HOC 的查询、订阅或突变

React-Apollo 错误:“...仅支持每个 HOC 的查询、订阅或突变”

React-apollo 突变 writeQuery 不更新 ui