`data` 在 apollo useMutation Promise 中未定义

Posted

技术标签:

【中文标题】`data` 在 apollo useMutation Promise 中未定义【英文标题】:`data` is undefined in apollo useMutation Promise 【发布时间】:2020-01-16 07:43:11 【问题描述】:

为什么data在Promise中是未定义的,即使它出现在下面的html中?

我不想使用.then((data) =>

const LoginPage: React.SFC<> = () => 
    const [login,  loading, data, error ] = useMutation<Q, V>(MUTATION)

    const onSubmit = event => 
        event.preventDefault()
        login(
            variables: 
                email,
                password
            
        ).then(() => 
            console.log(data)         // <-- undefined
        ).catch(() => 
            console.log(error)        // <-- OK
        )
    

    return <div>
        <form onSubmit=onSubmit> ... </form>

        data && <pre>JSON.stringify(data)</pre>          //  <-- OK
    </div>

【问题讨论】:

【参考方案1】:

原始问题的变体。不确定它是否按预期工作,因为突变的 Promise 的结果是未定义的。谢谢。

        const [login] = useMutation(MUTATION);

        const onSubmit = event => 
            event.preventDefault()
            login(
                variables: 
                    email,
                    password
                
            ).then((result) => 
                console.log(result)       // <-- undefined
            ).catch(() => 
                console.log(error)        // <-- OK
            )
        

【讨论】:

【参考方案2】:

这是按预期工作的。调用由useState 钩子is asynchronous 返回的状态更新器函数引起的状态更新。 useState 在后台被useMutation 用来管理钩子返回的各种状态位(dataloadingerror 等),所以这个状态也会异步更新。这意味着 login 返回的 Promise 可以解析,并且在这样做时,适当的状态将被更新,而不是立即更新。更新后,组件会重新渲染,您会在组件中看到更新后的值。

如果您需要在 Promise 解析后以某种方式使用突变返回的数据,那么您需要通过从 Promise 的解析值中提取它来实现,而不是依赖于组件状态。

【讨论】:

以上是关于`data` 在 apollo useMutation Promise 中未定义的主要内容,如果未能解决你的问题,请参考以下文章

k8s 部署 apollo 配置中心

k8s 部署 apollo 配置中心

react-apollo 中的 data.refetch() 函数如何工作

Apollo Refetch() 后组件“props.data”不重新加载

如何在 react-apollo 中等待多个 useLazyQuery

apache-apollo-1.7.1中的mybroker下的data文件里面的内容能够清理吗