apollo - `data` 在 apollo useMutation Promise 中未定义
问题描述
data
即使它出现在下面的 html 中,为什么在 Promise 中未定义?
我不想用.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>
}
解决方案
这是按预期工作的。useState
调用钩子返回的状态更新函数引起的状态更新是异步的。useState
用于useMutation
管理钩子返回的各种状态位(data
、loading
、error
等),因此该状态也将异步更新。这意味着由返回的 Promiselogin
可以解析,并且在这样做时,适当的状态将被更新,而不是立即更新。更新后,组件将重新呈现,您会看到组件中呈现的更新值。
如果您需要在 Promise 解析后以某种方式使用突变返回的数据,那么您需要通过从 Promise 的解析值中提取它来实现,而不是依赖于组件状态。
推荐阅读
- c# - Bind view-model property setter to control method
- c++ - 当您使用库中的抽象类时,如何解决“抽象类的深拷贝”问题?
- docker - 为什么 Flask-Cors 在生产中没有检测到我的跨域域?
- arrays - 更改 char[] 数组的元素
- python - 关于如何在 django 中刷新 js 文件的任何建议,我更改了 URL,但它仍在加载 privious 的
- python - Polar plot in Python looks quite strange
- javascript - 如何在 AngularJS 代码中隐藏 Angular 组件
- android - Flutter / OneSignal:我在使用 postNotificationWithJson 时遇到问题
- regex - 如何在 Azure Purview 中为数据分类创建列名模式匹配?
- azure-purview - Azure Purview 的数据工厂连接页面中缺少“新建”按钮