React native 如何从外部代码将新路由推送到react native中的导航器上?

React native 如何从外部代码将新路由推送到react native中的导航器上?,react-native,React Native,在renderScene函数中很容易获得对navigator的引用,因此在响应JSX树中发生的事件时调用navigator.push(newRoute)非常简单 在我的例子中,我想从外部事件调用navigator.push(newRoute)。我的应用程序使用谷歌登录用户,并在登录完成后触发一个事件,在这种情况下,我想导航到一条新路线 如何获取导航器的引用?除了作为renderScene的参数之外,还有什么方法可以获取它?您可以通过refs属性获取导航器:。它是react的一部分(不是react

renderScene
函数中很容易获得对
navigator
的引用,因此在响应JSX树中发生的事件时调用
navigator.push(newRoute)
非常简单

在我的例子中,我想从外部事件调用
navigator.push(newRoute)
。我的应用程序使用谷歌登录用户,并在登录完成后触发一个事件,在这种情况下,我想导航到一条新路线


如何获取导航器的引用?除了作为
renderScene
的参数之外,还有什么方法可以获取它?

您可以通过refs属性获取导航器:。它是react的一部分(不是react native特有的)。从react-native文档中看不出react-native中可以使用许多“react”功能,因此我建议您仔细了解react的总体情况

然而,请注意,Facebook没有明确而大声地提到裁判是有充分理由的。Refs实际上不是访问组件的“转到”方式。当然,你的情况可能会有所不同,但谷歌的注册很可能不是“外部的”。它实际上可能是导航器上方层次结构树中的一个组件的一部分(在这种情况下,可以将状态更改传递到树下)

引用上述“关于参考文献的更多信息”文件摘要:

如果您尚未使用React编程多个应用程序,请首先 通常倾向于尝试使用ref来“制造事物” 在你的应用程序中“发生”。如果是这样的话,花点时间多想想 批判性地讨论在组件中应该在何处拥有状态 等级制度通常情况下,很明显,正确的“拥有”位置 状态在层次结构中处于较高级别。把国家放在那里 通常消除了使用REF“使事情发生”的欲望- 相反,数据流通常会实现您的目标


同样,您的情况可能不同,使用refs可能是完全合理的,但是如果您试图(例如)将所有与Google相关的内容分离到单独的对象,并且如果这使注册成为“外部的”,请三思。React确实鼓励将与“组件”逻辑相关的所有内容放在一个地方(组件),即使其中包括各种技术和外部API。

谢谢您的回答。特别是对于导航器来说,我们似乎没有必要的工具来保持像GoogleSignin这样的内部功能。理想情况下,我的flux存储将更新一个
signedIn:true
,然后会有人注意到它和
navigator.push(newSignedInRoute)
。使用我自己定义的组件,我可以使用
componentDidMount
向我的存储和其他“外部”东西添加新的侦听器。有了导航器,我唯一能找到自然参照的地方就是
renderScene
。您是否建议在
renderScene
中添加/删除更改处理程序?为了稍微澄清我的情况,我有一个GoogleSigninButton,单击该按钮时,会调用一些本机objective c代码来执行GoogleSigninShenaigan。来自objective c的响应通过一个事件返回给JS。我想我可以让GoogleSigninButton(它可以为
navigator
提供一个自然的上下文)监听该事件,并调用一个回调,该回调反过来会导航到一个新的路由。。。但我还是希望一个商店发出一个
已更改的
事件并导航以响应它。我同意发出事件并拥有商店是一种很好的反应模式。我自己也在为类似的导航器的使用而挣扎。其中一种可能的工作方式是,在内部使用ref进行一点合成+类似于中接受的答案:。外部组件可以有它的
componentDidMount
,内部使用ref获取导航器的引用。它有点泄漏,因为ref可以在外部使用,但是组件可以有额外的逻辑(签名),并且可以独立使用。很好,这就是我决定的。再次感谢Jarek