Javascript 如何清除useffect调用中的函数?
所以我在更新useEffect钩子中的状态,并得到这个错误,如果我们在useEffect钩子中使用异步/等待语法,我不知道如何使用清理函数 错误:警告:无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。若要修复此问题,请取消%s.%s中的所有订阅和异步任务,这是一个useEffect清理函数Javascript 如何清除useffect调用中的函数?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,所以我在更新useEffect钩子中的状态,并得到这个错误,如果我们在useEffect钩子中使用异步/等待语法,我不知道如何使用清理函数 错误:警告:无法对未安装的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。若要修复此问题,请取消%s.%s中的所有订阅和异步任务,这是一个useEffect清理函数 const getToken = async () => { const mytoken = await AsyncStorage.getIt
const getToken = async () => {
const mytoken = await AsyncStorage.getItem("fb_token");
if (mytoken) {
navigation.navigate("Main", { screen: "Map" });
setToken(mytoken);
} else {
setToken(false);
}
};
getToken();
}, [navigation]);```
How to update state and use clean up function should i declare this function outside hook but if i do that how would i use that function as a clean up?
当组件卸载或由于某个
useffect
依赖项发生更改而重新安装时,您可以通过从返回函数获得回调。你可以用它来设置一个标志,让自己知道事情已经改变了。请参见***
注释:
useEffect(() => {
let cancelled = false; // *** A flag to let us know this is cancelled
const getToken = async () => {
const mytoken = await AsyncStorage.getItem("fb_token");
if (!cancelled) { // *** Check the flag
if (mytoken) {
navigation.navigate("Main", { screen: "Map" });
setToken(mytoken);
} else {
setToken(false);
}
}
};
getToken().catch(error => { // ***
// Handle/report error here... // *** Handle errors from the async function
}); // ***
// *** A callback to let us know to set the flag
return () => {
cancelled = true;
};
}, [navigation]);
(您还违反了上面标记的承诺规则之一:始终要么处理错误,要么将承诺链传递到将发生的事情上。)
请注意,正如我前面提到的,这将在两种情况下跳过设置令牌:
导航
已更改当组件卸载或由于某个
useffect
依赖项发生更改而重新安装时,您可以通过从返回函数获得回调。你可以用它来设置一个标志,让自己知道事情已经改变了。请参见***
注释:
useEffect(() => {
let cancelled = false; // *** A flag to let us know this is cancelled
const getToken = async () => {
const mytoken = await AsyncStorage.getItem("fb_token");
if (!cancelled) { // *** Check the flag
if (mytoken) {
navigation.navigate("Main", { screen: "Map" });
setToken(mytoken);
} else {
setToken(false);
}
}
};
getToken().catch(error => { // ***
// Handle/report error here... // *** Handle errors from the async function
}); // ***
// *** A callback to let us know to set the flag
return () => {
cancelled = true;
};
}, [navigation]);
(您还违反了上面标记的承诺规则之一:始终要么处理错误,要么将承诺链传递到将发生的事情上。)
请注意,正如我前面提到的,这将在两种情况下跳过设置令牌:
导航
已更改导航到另一页后,您正在执行
setToken
。这可能就是问题所在如果我在导航函数之前调用setToken,那么之后我需要调用clean up函数吗?看看这是否有帮助:@Edward ya it Help,特别是导航到另一个页面后您正在执行的useRef方法setToken
。这可能就是问题所在如果我在导航函数之前调用setToken,那么之后我需要调用clean up函数吗?看看这是否有帮助:@Edward ya it Help,特别是useRef方法