更新:现在有一个小吃演示
我已经创建了demo on snack,因此您可以第一手看到问题,并帮助我在实际代码中演示解决方案。
重复步骤
_____________________________
“我的应用”具有以下导航层次结构,其中<>
的每个实例都只是一个常规组件
App <StackNavigator> {
EventList <>
EventTabs <BottomTabNavigator> {
Quests <>
Leaderboard <>
Gallery <>
More <StackNavigator> {
MoreList <>
TeamMembers <>
}
}
}
进入应用程序后,用户的第一个屏幕为EventList
。他们单击按钮导航到EventTabs
,所以我可以使用navigation.navigate()
在传递状态的同时进行过渡,就像这样……
EventList.navigation.navigate(EventTabs, passedParams);
至此,一切都有意义。但是TeamMembers
也需要访问passedParams
。我很困惑如何传递这些。因此,我的问题...如何从passedParams
组件访问TeamMembers
?它们似乎仅适用于EventTabs
。
如果答案是使用navigate.setParams()
,那么我不确定该在哪里使用。
如果答案是使用NavigationActions.setParams()
,那么我也不知道该在哪里使用。
答案 0 :(得分:1)
不幸的是,我们对此没有很好的支持,但是您可以使用这样的函数来递归地导航您的导航父母,以寻找正确的参数。
function getParam(navigation, paramName) {
const { getParam, dangerouslyGetParent } = navigation;
let parent = dangerouslyGetParent();
let val = getParam(paramName);
while (val === undefined && parent && parent.getParam) {
val = parent.getParam(paramName);
parent = parent.dangerouslyGetParent();
}
return val;
}
答案 1 :(得分:1)
该问题似乎在React导航的5.x版本中仍然存在。 对我来说,这可行。
function getParentParam(navigation, paramName) {
const { dangerouslyGetParent } = navigation;
let paramValue = null;
const parent = dangerouslyGetParent();
const routes = parent.dangerouslyGetState().routes;
routes.some((r) => {
paramValue = r.params ? r.params[paramName] : null;
return paramValue !== null;
});
return(paramValue);
}
您可以根据您拥有的深度级别遍历parent.dangerouslyGetParent()