React 检测到 Hook 调用的顺序发生了变化
我刚刚开始学习 React Native,我正在尝试创建一个使用 NativeBase ActionSheet 组件的登录屏幕,但我不断收到一条错误,指出 React 已检测到调用的 Hooks 顺序发生了变化
我相信这是由于 fontsLoaded
布尔值以异步方式加载,但我不太确定。处理异步方法并确保屏幕正确加载的正确方法是什么?
这是我的代码:
function LoginScreen() {
let [fontsLoaded] = useFonts({
HammersmithOne_400Regular,
})
if (!fontsLoaded) {
return <AppLoading />;
}
const {
isOpen,
onOpen,
onClose
} = useDisclose();
return (
<View style={styles.container}>
<Text style={styles.logo}>Logo</Text>
<View style={styles.signInContainer}>
<Button onPress={onOpen} title="Log in">
Log in
</Button>
<Actionsheet isOpen={isOpen} onClose={onClose}>
<Actionsheet.Content>
<Box w="100%" h={60} px={4} justifyContent="center">
<Text>
Albums
</Text>
</Box>
</Actionsheet.Content>
</Actionsheet>
</View>
</View>
);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
那么你违反了钩子规则,因为你在 if (!fontsLoaded) { return ; 之后有条件地调用 useDisclose 。 必须在组件
的顶层调用挂钩。
在这里您可以在 React 文档中找到有关所有钩子规则的更多信息:
https://reactjs.org/docs/hooks-rules.html
为了解决您的问题,您必须在 if 语句之前调用 useDisclose 。
Well you are violating hook-rule, because you are calling useDisclose conditionally, after if (!fontsLoaded) { return ; }
Hooks must be called on the top level of your components.
Here you can find more about all hook rules in react docs:
https://reactjs.org/docs/hooks-rules.html
In order to fix your issue you will have to call useDisclose before if statement.
将 useDisclose 挂钩移至顶部,将 if 语句移至下方。
原因如下 为什么
Move useDisclose hook to the top and if statement below.
Here is the reason why