React native 反应导航-从导航状态删除组件并导航到屏幕
我将React导航用作React本机应用程序中的路由器。我有一个问题,当我在屏幕之间导航时,我们之前渲染的屏幕创建的挂钩仍然存在 我有一个完全扁平的路由器:React native 反应导航-从导航状态删除组件并导航到屏幕,react-native,react-navigation,React Native,React Navigation,我将React导航用作React本机应用程序中的路由器。我有一个问题,当我在屏幕之间导航时,我们之前渲染的屏幕创建的挂钩仍然存在 我有一个完全扁平的路由器: const AppRouter=()=>{ const Stack=createStackNavigator(); 返回( ); }; 当我从Dashboard>TimeInput>InCallContainer>Dashboard>TimeInput>InCallContainer导航时,第一次访问它时在InCallContainer中
const AppRouter=()=>{
const Stack=createStackNavigator();
返回(
);
};
当我从Dashboard>TimeInput>InCallContainer>Dashboard>TimeInput>InCallContainer
导航时,第一次访问它时在InCallContainer
中创建的钩子在第二次访问它时仍然存在
我正在使用以下方法进行导航:
从'@react-navigation/native'导入{StackActions};
从“React”导入*作为React;
export const navigationRef=React.createRef();
导出函数导航(…参数){
navigationRef.current.navigate(…参数);
}
然后:
RootNavigation.navigate('InCallContainer');
我可以知道钩子被创建了多次,因为如果我在使用这些钩子的组件中登录,每次我导航到它们时,我都会得到一个以上的日志。所以当我第二次访问屏幕时会有两个日志,以此类推
我希望能够第二次导航到仪表板,当我导航到仪表板时,从内存中卸载/删除此导航之前的所有组件
我试过替换、重置、按下、弹出按钮,但都没有达到预期效果
我怎样才能做到这一点
短暂性脑缺血发作
更新:
我需要从Redux Thunk中以编程方式导航到InCallContainer
:
export const answerCall=(calleeName)=>(dispatch,getState)=>{
const{session,callType}=getState().callData;
acceptCall(会话,{calleeNameFromOwnContacts:calleeName});
分派(callData({callState:INCOMING}));
停止铃声();
RootNavigation.navigate('InCallContainer');
InCallManager.start({media:callType==VIDEO?'VIDEO':'audio'});
InCallManager.turnScreenOn();
};
AllContainer中的屏幕尚未卸载,当我们准备在同一导航器中使用相同的键打开屏幕时,它不会重新渲染它共享其实例,因此如果您准备使用其挂钩重新渲染它,则必须创建单独的导航器。使用导航
对已在中的路线进行导航导航历史记录不创建新路线,只需导航到它即可您需要使用
push
而不是navigate
作为RootNavigation.push('InCallContainer')
。
而
push
将创建新路线
了解
此示例显示了推送
和导航
尝试零食之间的区别。- 使用
访问次数增加+1导航时
- 但使用
以首次访问时间开始新路线。push
导入“反应本机手势处理程序”;
从“React”导入*作为React;
从“react native”导入{按钮、视图、文本};
从'@react-navigation/native'导入{NavigationContainer};
从'@react navigation/stack'导入{createStackNavigator};
功能主屏幕({navigation}){
常量[visitTimes,setVisitTimes]=React.useState(0);
React.useffect(()=>{
const unsubscribe=navigation.addListener('focus',()=>{
设置访问时间(v=>v+1);
});
退订;
},[导航];
返回(
到家时间:
{访问时间}
navigation.push('Details')}
/>
);
}
函数DetailsScreen({navigation}){
常量[visitTimes,setVisitTimes]=React.useState(0);
React.useffect(()=>{
const unsubscribe=navigation.addListener('focus',()=>{
设置访问时间(v=>v+1);
});
退订;
},[导航];
返回(
详细访问时间:
{访问时间}
navigation.navigate('Home')}
/>
);
}
const Stack=createStackNavigator();
函数App(){
返回(
);
}
导出默认应用程序;
我不确定您使用的是什么挂钩,但React Navigation确实为生命周期事件公开了自己的挂钩
替换传统useEffect挂钩的示例:
import { useFocusEffect } from '@react-navigation/native';
function Profile() {
useFocusEffect(
React.useCallback(() => {
// Do something when the screen is focused
return () => {
// Do something when the screen is unfocused
// Useful for cleanup functions
};
}, [])
);
return <ProfileContent />;
}
从'@react navigation/native'导入{useFocusEffect};
函数配置文件(){
聚焦效应(
React.useCallback(()=>{
//当屏幕聚焦时做些什么
return()=>{
//在屏幕未聚焦时执行某些操作
//对于清除函数很有用
};
}, [])
);
返回;
}
只有当您导航到该组件并且该组件在React导航上下文中成为“焦点”时,才会触发此操作。React导航尝试提前装载所有视图以提高性能,这就是为什么传统React挂钩与React导航公开的焦点样式相比会导致问题。Ok thank you@Jignesh-您能提供一个快速示例说明我应该如何做到这一点吗?此外,如果在导航到组件时不需要该组件的相同实例,这是否也包括所有子组件?您希望如何实现屏幕导航,因为这里我们必须创建一个单独的导航器?每次我导航到“InCallContainer”时,它必须是该组件的一个全新实例,并且每个子组件和挂钩必须是一个全新的实例