React native 如何在react组件外部使用react导航进行导航?

React native 如何在react组件外部使用react导航进行导航?,react-native,React Native,我正在构建一个代码来检查access\u令牌或refresh\u令牌是否有效。我正在使用axios拦截器检查响应以生成新令牌 如何在axios拦截器内使用导航(反应导航) 错误: 09:53:55.852客户端日志场列表:React.FC->error[错误:无效] 钩子调用。钩子只能在函数体内部调用 这可能是由于以下原因之一 axios.interceptors.response.use( (回应)=>{ 返回响应 }, 异步(错误)=>{ const navigation=useNaviga

我正在构建一个代码来检查access\u令牌或refresh\u令牌是否有效。我正在使用axios拦截器检查响应以生成新令牌

如何在axios拦截器内使用导航(反应导航)

错误:

09:53:55.852客户端日志场列表:React.FC->error[错误:无效] 钩子调用。钩子只能在函数体内部调用 这可能是由于以下原因之一

axios.interceptors.response.use(
(回应)=>{
返回响应
},
异步(错误)=>{
const navigation=useNavigation()
const originalRequest=error.config
const accessToken=wait getAccessToken()
const refreshToken=await getRefreshToken()
如果(
error.response.status==400&&
originalRequest.url==connectTokenUrl&&
accessToken
) {
RemoveConnectionToken()
导航。导航('SignIn')
返回承诺。拒绝(错误)
}
if(error.response.status==401&&!originalRequest.\u重试){
原始请求。\u重试=true
console.log('entrou401')
如果(!刷新令牌){
导航。导航('SignIn')
返回承诺。拒绝(错误)
}
常数数据={
授予类型:“刷新令牌”,
客户id:“xxx”,
刷新令牌:刷新令牌,
}
const formData=new formData()
_.forEach(数据,(值,键)=>{
formData.append(键、值)
})
返回轴({
方法:“post”,
url:connectTokenUrl,
数据:formData,
标题:{'Content-Type':'multipart/form data'},
})。然后((响应)=>{
const{access_token,refresh_token}=response.data
连接令牌(访问令牌、刷新令牌)
axios.defaults.headers.common.Authorization=`Bearer${accessToken}`
返回axios(原始请求)
})
}
返回承诺。拒绝(错误)
},
)

您的导航参数在哪里?如果您能向我展示更多的代码(完整的组件)将很有帮助,您可能正在调用功能组件之外的某个钩子

有几种方法可以访问导航之外的导航道具

  • 钩子:用于从导航容器下的功能组件访问导航道具的场景。例如:屏幕内的导航按钮

  • :这用于在导航之外访问导航的场景,用于redux中间件之类的场景

  • 您应该在此场景中使用导航引用并执行导航操作。您可以使用RootNavigation.js并调用导航操作

    import { NavigationContainer } from '@react-navigation/native';
    import { navigationRef } from './RootNavigation';
    
    export default function App() {
      return (
        <NavigationContainer ref={navigationRef}>{/* ... */}</NavigationContainer>
      );
    }
    

    这可能会对您有所帮助。我没有任何参数。那么在没有参数的情况下如何调用“navigation.navigate('SignIn')?您需要将导航参数传递给您的组件,或者您可以导入{withNavigation}从“react navigation”;要使用itI请注意,您使用的是useNavigationHook,但您在Axios拦截器中使用它,您需要在功能组件顶部声明它才能工作。
    import * as React from 'react';
    
    export const navigationRef = React.createRef();
    
    export function navigate(name, params) {
      navigationRef.current?.navigate(name, params);
    }