React native 如何在react组件外部使用react导航进行导航?
我正在构建一个代码来检查access\u令牌或refresh\u令牌是否有效。我正在使用axios拦截器检查响应以生成新令牌 如何在axios拦截器内使用导航(反应导航) 错误: 09:53:55.852客户端日志场列表:React.FC->error[错误:无效] 钩子调用。钩子只能在函数体内部调用 这可能是由于以下原因之一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
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(原始请求)
})
}
返回承诺。拒绝(错误)
},
)
您的导航参数在哪里?如果您能向我展示更多的代码(完整的组件)将很有帮助,您可能正在调用功能组件之外的某个钩子有几种方法可以访问导航之外的导航道具
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);
}