reactjs - Reactjs useState 挂钩未更新承诺数据
问题描述
我使用的是反应钩子而不是基于类的组件,但是当我从 graphql API 获取数据时它没有更新状态。
在这里你去我的代码:
import React, { useEffect, useState } from 'react';
import client from '../gqlClient';
import { gql, ApolloClient, InMemoryCache } from '@apollo/client';
const client = new ApolloClient({
uri: 'http://localhost:8000/graphql/',
cache: new InMemoryCache(),
});
function EmpTable() {
const [employee, setEmployee] = useState({});
useEffect(() => {
client
.query({
query: gql`
query {
employees {
name
}
}
`
})
.then(result => {
setEmployee({result});
console.log(employee);
});
}, [])
return (
<div>return something</div>
)
};
export default EmpTable;
当我打印employee
它时,它只打印初始值。
但是当打印结果时,控制台会显示我从 API 获得的所有数据。
我使 useEffect 仅在加载页面/组件后运行,但它不起作用。
谁能帮我解决这个问题?
解决方案
setEmployee
是异步方法,因此您无法employee
立即获取 after的更新值setEmployee
。
setEmployee({result});
console.log(employee); // This will show the old `employee` value.
您应该在useEffect
添加employee
依赖项的情况下获得更新的结果。
useEffect(() => {
client
.query({
query: gql`
query {
employees {
name
}
}
`
})
.then(result => {
setEmployee({result});
console.log(employee);
});
}, [])
useEffect(() => {
console.log(employee);
}, [employee]);
推荐阅读
- firebase - 如何在 Firebase 上创建 Busuu 每日提醒通知
- aws-lambda - 功能即服务 (FaaS) 托管如何在后台工作?
- go - 为什么 go-jaeger-client 需要度量和日志的包装器?
- reactjs - 为什么 Scrollspy 未在反应应用程序中加载?
- java - 异步回调和监听器
- sql - 如何在 SQL Server 脚本中使用临时表?
- python - python内存因循环而爆炸
- php - 我们可以在 php 中使用和操作 mysql 数据吗?
- vue.js - vue-material 本地化主题避免冲突
- android - Mpandroidchart 无法根据需要对数据进行分组?