尝试在useEffect上加载数据后更新状态。能够更新局部变量但不能更新状态。我正在遵循https://www.robinwieruch.de/react-hooks-fetch-data/中的一个示例,其中Robin以类似的方式设置状态。由于某种原因,在我的情况下,永远不会正确设置状态变量。
使用AWS Amplify加载graphQL数据。似乎可以成功使用局部变量,但不能成功处理状态变量。
const [serviceTypes, setServiceTypes] = useState([{}]);
let myServiceTypes = [{}]; // try it with a local variable to debug
useEffect(() => {
let unmounted = false;
async function fetchData() {
const result = await API.graphql(
graphqlOperation(queries.listServiceTypes)
);
console.log(result);
console.log('setting service types...');
console.log(result.data.listServiceTypes.items);
setServiceTypes(result.data.listServiceTypes.items);
myServiceTypes = result.data.listServiceTypes.items;
console.log(myServiceTypes); // set correctly
console.log(serviceTypes); // empty
}
if (!unmounted) {
fetchData();
}
return () => {
unmounted = true;
};
}, []);
期望将serviceTypes设置为加载的数据。相反,它是空的。
答案 0 :(得分:0)
setState不能像这样同步工作。您不能期望serviceTypes变量在设置后立即包含数据。重新渲染组件时将对其进行更新。尝试将console.log(serviceTypes);
移到useEffect之外。
有关https://stackoverflow.com/a/36087156/5273790的setState异步说明。
答案 1 :(得分:0)
这是因为您没有考虑效果并正确渲染。
安装/渲染1
渲染2
尝试在渲染/返回之前注销serviceTypes