Javascript 取消使用效果';s与TypeScript异步,正确的方式
我有一个简单的例子让我感到悲伤:Javascript 取消使用效果';s与TypeScript异步,正确的方式,javascript,reactjs,typescript,use-effect,Javascript,Reactjs,Typescript,Use Effect,我有一个简单的例子让我感到悲伤: useffect(()=>{ axios.get(…)。然后(…)。catch(…) },[props.foo]) 警告:无法对未安装的组件执行react状态更新 做了一些调查,比较容易理解。TypeScript似乎不喜欢这种方法,因为useffect应该返回一个空值 useffect(()=>{ 让isSubscribed=true axios.get(…)。然后(…)。catch(…) return()=>(isSubscribed=false) },[p
useffect(()=>{
axios.get(…)。然后(…)。catch(…)
},[props.foo])
警告:无法对未安装的组件执行react状态更新
做了一些调查,比较容易理解。TypeScript似乎不喜欢这种方法,因为useffect
应该返回一个空值
useffect(()=>{
让isSubscribed=true
axios.get(…)。然后(…)。catch(…)
return()=>(isSubscribed=false)
},[props.foo])
类型脚本:
/**
*接受包含命令式、可能有效代码的函数。
*
*@param effect命令函数,可返回清理函数
*@param deps如果存在,则仅当列表中的值更改时才会激活该效果。
*
*@version 16.8.0
*@见https://reactjs.org/docs/hooks-reference.html#useeffect
*/
函数useffect(效果:EffectCallback,deps?:DependencyList):void;
如何使用TS在myuseEffect
中实施isSubscribed
谢谢。
useffect
本身返回void
,但提供给useffect
的函数类型为EffectCallback
。这被定义为:
// NOTE: callbacks are _only_ allowed to return either void, or a destructor.
// The destructor is itself only allowed to return void.
type EffectCallback = () => (void | (() => void | undefined));
这意味着您的效果回调实际上可以返回一个函数,该函数必须返回void
或undefined
现在,您可以解决问题,避免使用isSubscribed
变量调用setState
。但另一种(也许更好)方法是直接取消请求
useEffect(() => {
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('...', { cancelToken: source.token }).then(/**/).catch(e => {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {/* handle error */}
});
return () => source.cancel();
}, [props.foo])
这也记录在了
当前代码的问题是,析构函数返回布尔值isSubscribed
。与其返回赋值,不如将赋值放入函数体中:
return () => {
isSubscribed = false;
}
我想这篇reddit文章用大括号来解决这个问题:
{isSubscribed=false}