React 检测到 Hook 调用的顺序发生了变化

发布于 2025-01-17 12:44:11 字数 1196 浏览 0 评论 0 原文

我刚刚开始学习 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>
);

}

I have just started learning react native and I'm trying to create a login screen that uses the NativeBase ActionSheet component, but I keep getting an error that states React has detected a change in the order of Hooks called

I believe this is due to the fontsLoaded boolean being loaded in async but I'm not exactly sure. What would be the proper way to handle async methods and make sure the screen is loaded correctly?

Here is my code:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ㄖ落Θ余辉 2025-01-24 12:44:11

那么你违反了钩子规则,因为你在 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.

你穿错了嫁妆 2025-01-24 12:44:11

将 useDisclose 挂钩移至顶部,将 if 语句移至下方。
原因如下 为什么

   let [fontsLoaded] = useFonts({
    HammersmithOne_400Regular,
})

const {
    isOpen,
    onOpen,
    onClose
  } = useDisclose();

if (!fontsLoaded) {
    return <AppLoading />;
}

Move useDisclose hook to the top and if statement below.
Here is the reason why

   let [fontsLoaded] = useFonts({
    HammersmithOne_400Regular,
})

const {
    isOpen,
    onOpen,
    onClose
  } = useDisclose();

if (!fontsLoaded) {
    return <AppLoading />;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文