当前位置: 首页 > 知识库问答 >
问题:

钩子错误从上下文到使用顺序的变化效果

孙乐逸
2023-03-14

错误警告:React 检测到身份验证页面调用的钩子顺序发生了变化。如果不修复,这将导致错误和错误。有关更多信息,请阅读钩子规则:https://reactjs.org/link/rules-of-hooks

代码:

import React, { useContext, useEffect, useState } from 'react';
import { Keyboard } from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { getCredentials } from '../util/Storage';
import { OrderContext } from '../OrderContext';
import { UserContext } from '../UserContext';

const AuthPage = ({ navigation }) => {
  const userContext = useContext(UserContext);
  const orderContext = useContext(OrderContext);
  const [isKeyboardVisible, setKeyboardVisibile] = useState(false);
  useEffect(() => {
    const getCreds = async () => {
      const c = await getCredentials();
      if (c) {
        navigation.replace('Home' : 'StartWizard');
      }
    };
    getCreds();
  }, []);

  const keyboardDidShow = () => {
    setKeyboardVisibile(true);
  };

  const keyboardDidHide = () => {
    setKeyboardVisibile(false);
  };

  useEffect(() => {
    Keyboard.addListener('keyboardDidShow', keyboardDidShow);
    Keyboard.addListener('keyboardDidHide', keyboardDidHide);

    return () => {
      Keyboard.removeListener('keyboardDidShow', keyboardDidShow);
      Keyboard.removeListener('keyboardDidHide', keyboardDidHide);
    };
  }, []);

  if (!global.navigation) {
    global.navigation = useNavigation();
  }

  return (
    <AuthView ... />
      }}
    />
  );
};

const Auth = ({ navigation }) => <AuthPage navigation={navigation} />;
export default Auth;

为什么订单发生变化,我如何纠正这种行为?

共有2个答案

张岳
2023-03-14
  if (!global.navigation) {
    global.navigation = useNavigation();
  }

永远不要有条件地调用钩子。这是钩子的规则

万俟招
2023-03-14

React总是期望调用相同的钩子,不管你的变量有什么值。

在这种情况下,您有条件地调用< code>useNavigation()挂钩,这完全打乱了React想要的内容。

要修复它,只需将钩子返回的值存储在临时变量中:

const currentNavigation = useNavigation();
if (!global.navigation) {
    global.navigation = currentNavigation;
}

或者如果没有问题,无条件覆盖global.navigation

global.navigation = useNavigation();

我强烈建议阅读钩子的规则,这样你就可以避免将来出现这样的错误。

 类似资料:
  • 我正努力让你去工作。以下是功能组件: 我称之为: 我得到一个错误,如下所示: 错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。发生这种情况的原因如下:1。React和渲染器(如React DOM)2的版本可能不匹配。你可能违反了Hooks 3的规则。同一应用程序中可能有多个React副本。 我已经调试并确认我使用的是单一版本。也许我使用状态钩子不正确? 这里是我调用自定义钩子的地方:

  • 我的应用程序一直在工作,直到最后一次提交。 现在,它在< code>npm start上工作正常,但是在使用< code>npm run builder部署它之后,我遇到运行时错误: 不变冲突:缩小的反应错误# 321;访问https://reactjs.org/docs/error-decoder.html?invariant=321获得完整的消息,或者使用非精简的开发环境获得完整的错误和其他有

  • 我得到以下错误,不确定我在箭头函数内实例化 react 钩子时做错了什么: 错误:挂接调用无效。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM)。 您可能违反了钩子的规则。 同一应用程序中可能有多个React副本。请参阅https://reactjs.org/link/invalid-hook-call有关如何调试和修复此

  • 我有两种不同类型的用户;让我们称它们为和。 我得到了容器中的user type的值,该容器具有实例: 现在我想映射这个值(使用functor实例),将包含的< code>BasicUser转换为< code>EnrichedUser用户,保留在容器中: 然而,< code>enrichUser并不返回< code > enrich user ,而是返回< code>OptionT[Future,e

  • 在使用PostgreSQL数据库启动sprint boot应用程序时出现错误,我试图找到一个解决方案,但到目前为止还没有找到。 这里有个错误: 2018-03-29 17:48:17.945警告13508--[main]ationConfigEmbeddedWebApplicationContext:上下文初始化过程中遇到异常-取消刷新尝试:org.springFramework.Beans.Fa

  • 我想知道为什么我的论点似乎在我的GraphQL解析器内切换。我用的是快速图形。 一个解析器的示例: 我已经写了文件中出现的参数名称:http://graphql.org/learn/execution/ 但当我调试和检查对象时,args对象似乎是第一个,上下文是第二个,父/根是第三个。 家长: args: 上下文: 某些服务器代码: 我的根解析器: 模式: