async-await - useEffect 中的 useState 不更新状态
问题描述
状态“状态”不会更改值,并且始终保持其初始值“待处理”并且不会将值更改为“暂停”,知道我确定请求返回结果
const [_talentID, setTalentID] = useState(props.match.params.idTalent);
const [_jobID, setJobID] = useState(props.match.params.idJob);
const [status, setStatus] = useState('pending');
useEffect(() => {
async function getStatus() {
await axios
.get('api')
.then(res => setStatus('on hold'))
}
getStatus();
}, []);
useEffect(() => {
console.log(status);
}, [status]);
解决方案
我的猜测是你在你的组件中做其他干扰。你能展示整个组件吗?
另外,这行得通吗?(基本上只是一些重构,并使用这个小钩子。
function usePromiseMemo(callback, deps) {
// Private states
const [state, setState] = useState();
const isMounted = useRef(true);
// Register unmount
useEffect(() => {
if (!isMounted.current) isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
// Execute callback
useEffect(() => {
if (isMounted.current) {
if (state !== undefined) setState(undefined);
Promise.resolve()
.then(() => callback())
.then(r => {
if (isMounted.current) setState(r);
});
}
}, deps || []);
// Return state
return state;
}
// YOUR COMPONENT HERE
function MyComponent(props: any) {
const [status, setStatus] = useState('pending');
// Result of axios.get("api")
const response = usePromiseMemo(
() =>
axios.get('api').then(res => {
setStatus('on hold');
return res;
}),
[setStatus]
);
useEffect(() => {
console.log(status);
}, [status]);
return <div></div>;
}
推荐阅读
- python - 最大重试次数超过 URL(由 NewConnection 错误引起)
- vue.js - 令牌应答后 Vuex 初始状态丢失
- kubernetes - 有没有办法隔离 Istio 服务网格中的部署?
- excel - 跨多列和变量行求和
- c# - 在 Azure 上发布 MVC 5 网站后出现“加载资源失败:net::ERR_CONTENT_DECODING_FAILED”错误
- list - Dart:检查列表中的项目
- amazon-web-services - 亚马逊免费套餐,要求选择加入 RDS 服务
- data-visualization - 如何在 AWS QuickSight 中创建每周 YoY 指标?
- python - 无法在 Azure 上选择 Web 作业
- python - 为什么python会覆盖键值对