Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应导航V2:Navigation.push和Navigation.navigate之间的差异_Reactjs_React Native_React Navigation - Fatal编程技术网

Reactjs 反应导航V2:Navigation.push和Navigation.navigate之间的差异

Reactjs 反应导航V2:Navigation.push和Navigation.navigate之间的差异,reactjs,react-native,react-navigation,Reactjs,React Native,React Navigation,我是个新来的土生土长的人,我现在正在学习英语。我想知道: navigation.push()和navigation.navigate()之间有什么区别 我试着自己找出答案,但他们似乎完成了完全相同的事情…根据上一篇博文: 对于v1: navigate(routeName)和push(routeName)非常相似:每次调用navigate(routeName)时,它都会将新路由推送到堆栈中。 对于v2: Now navigate(routeName)将首先尝试查找路由的现有实例,如果该实例存在,则

我是个新来的土生土长的人,我现在正在学习英语。我想知道:
navigation.push()
navigation.navigate()
之间有什么区别


我试着自己找出答案,但他们似乎完成了完全相同的事情…

根据上一篇博文: 对于v1:

navigate(routeName)和push(routeName)非常相似:每次调用navigate(routeName)时,它都会将新路由推送到堆栈中。

对于v2:

Now navigate(routeName)将首先尝试查找路由的现有实例,如果该实例存在,则跳转到该实例,否则会将路由推送到堆栈。

导航>转到页面的实例(如果存在)或推送新实例


推送>推送一个新实例,即使已经存在一个实例

如果您查看文档中的内容,就会看到它们之间的区别

推送操作在堆栈顶部添加路由并向前导航 去吧。这与导航不同,导航将弹出到 如果组件已经安装在堆栈中,则在堆栈的前面。推 将始终添加到顶部,因此可以多次安装组件

我们可以拿Instagram为例

考虑导航到用户的配置文件。然后你可以检查用户的追随者,然后你也可以导航到他们的个人资料。
如果您仅使用
导航
操作执行相同的操作,当您从关注者列表屏幕单击用户配置文件时,将导航到上一个配置文件,但如果使用
推送
,则会将新屏幕推到堆栈中并显示正确的配置文件。这样你就可以回到第一个屏幕。

我想我可以回答这个问题

我们有三个页面:主页1第2页

“home”是“initialRouteName”,“page1”和“page2”是子页面

因此,当我们从主页开始,推送page1(或导航page1)时,页面堆栈是:

(2) 。第1页

(1) 。家

我推了三次第2页,堆栈是:

(5) 。第2页

(4) 。第2页

(3) 。第2页

(2) 。第1页

(1) 。家

现在我想回家,我可以

1次弹出四次,或直接弹出(4)

2浏览第1页,然后弹出一次

一次3个按钮

当页面堆栈没有页面1时,导航的工作原理与推送相同,将页面推到堆栈顶部并显示页面

当页面堆栈有page1时,navigate的功能是跳转到最靠近堆栈顶部的page1,并在page1上方弹出其他页面

例如,以下页面堆栈:

(7) 。第2页

(6) 。第2页

(5) 。第2页

(4) 。第1页

(3) 。第1页

(2) 。第1页

(1) 。家

如果你想回家,你应该先浏览第1页,然后弹出三次

应该注意的是,当当前页面是page1,并且您导航到page1时,什么都没有

发生了

下面是我编写的一些测试代码,您只需复制到App.js即可

import*as React from'React';
从“react native”导入{按钮、视图、文本};
从'@react-navigation/native'导入{NavigationContainer};
从'@react navigation/stack'导入{createStackNavigator};
功能主屏幕({navigation}){
返回(
导航('page1',{“pageName”:“page1”})
/>
navigation.push('page1',{“pageName”:“page1”})
/>
);
}
功能页({路由,导航}){
返回(
{`当前页面为${route.name}`}
navigation.navigate('page1')}
/>
navigation.push('page1')}
/>
navigation.push('page2')}
/>
navigation.push('page2')}
/>
navigation.navigate('Home')}
/>
navigation.pop()}
/>
navigation.poptoop()}
/>
);
}
const Stack=createStackNavigator();
函数MyStack(){
返回(
);
}
导出默认函数App(){
返回(
);

}
想让它简洁明了


Navigation.navigate
检查屏幕是否在堆栈中,因此它会进入堆栈(到较旧的状态),但
Navigation.push
只会进入新屏幕,而不检查之前是否访问过屏幕以及堆栈中是否有该屏幕。

还会导航并弹出堆栈之间的所有实例吗?假设我有3个实例:A、B和C。A->navigate B->navigate C->在只有A的堆栈中导航结果,还是堆栈仍然是B C?使用push,它将是一个B C A,对吗?对你来说,同样的问题是:是否会导航并弹出中间的所有实例?假设我有3个实例:A、B和C。A->navigate B->navigate C->在只有A的堆栈中导航结果,还是堆栈仍然是B C?有了推,它将是一个B C A,对吗?:)navigate将弹出到堆栈中较早的位置,据我所知,它会弹出堆栈之间的所有实例。我想你可以用一个简单的