javascript - 如何从在顶层呈现的组件调用导航

标签 javascript react-native react-navigation

根据有关 react-navigation 的文档,您可以使用以下方法从顶级组件调用导航:

import { NavigationActions } from 'react-navigation';

const AppNavigator = StackNavigator(SomeAppRouteConfigs);

class App extends React.Component {
  someEvent() {
    // call navigate for AppNavigator here:
    this.navigator && this.navigator.dispatch(
      NavigationActions.navigate({ routeName: someRouteName })
    );
  }
  render() {
    return (
      <AppNavigator ref={nav => { this.navigator = nav; }} />
    );
  }
}

但是,如果执行分派(dispatch)的逻辑位于与导航器处于同一级别的另一个组件中,我将如何做到这一点?在我的例子中,我创建了我的导航器(一个带有堆栈导航器和其他嵌套导航器的抽屉),然后我使用 <Drawer> 渲染它们。 .在同一水平面上,我正在加载我的 <PushController>处理推送通知的组件。 pushcontroller 实际上得到了我想要分派(dispatch)的事件。

我不知道如何将 ref 传递(?)到 pushcontroller 组件以便我可以使用它,目前以下内容不起作用。我收到控制台日志,告诉我 fcm.ACTION.OPEN_NOTIFICATION 已触发但没有发生调度。我想这可能是因为 ref 是在渲染期间创建的,并且在渲染发生时它还不能传递?但我也不确定您是否会这样做,以便让另一个组件访问在同一级别声明的 ref。提前感谢您的帮助!

Drawer + PushController渲染

  render(){
      return(
        <View style={{flex: 1}}>
          <Drawer ref={nav => { this.navigator = nav; }}/>
          <PushController user={this.props.user} navigator={this.navigator}/>
        </View>
      )
  }

PushController 片段:

import { NavigationActions } from 'react-navigation';

async doFCM() {
    FCM.getInitialNotification().then(notif => {
      console.log('Initial Notification', notif);
      if(notif.fcm.action === "fcm.ACTION.OPEN_NOTIFICATION"){
        console.log('fcm.ACTION.OPEN_NOTIFICATION triggered', notif);
        this.props.navigator && this.props.navigator.dispatch(NavigationActions.navigate({routename: 'Chat'}))
      }
    });
}

最佳答案

答案是将导航调用移动到渲染时定义的函数并将其传递给组件。

import { NavigationActions } from 'react-navigation';

...
//class definition omitted for brevity
  render(){
    const callNavigate = (routeName, params) => {
      console.log('Params', params);
      this.navigator.dispatch({
        type: NavigationActions.NAVIGATE,
        routeName: routeName,
        params: params
      }) 
    }

      return(
        <View style={{flex: 1}}>
          <Drawer ref={nav => this.navigator = nav }/>
          <PushController callNavigate={callNavigate}/>
        </View>
      )
  }

该函数在 PushController 中调用如下:

  this.props.callNavigate('RouteName', params);

关于javascript - 如何从在顶层呈现的组件调用导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48719141/

相关文章:

JavaScript - 图遍历 - 从起始节点按顺序(最接近的第一个)获取节点

javascript - &lt;textarea&gt; 元素在调用 jQuery().wrapInner 后为空

javascript - 有效的查询参数 - 在 URL 中传递数据

android - React native-fbsdk 未知问题?

javascript - React Native 导航中的单独导航

javascript - 为什么谷歌地图自动完成服务在结果中包含爱尔兰地址,即使仅限于 "gb"?

android - 如何使用控制台在 React Native Android 中调试 Java 代码

javascript - 推送到 React 状态数组

ios - 使用 React Native 0.60 : Unhandled JS Exception: null is not an object (evaluating 'n.apply' ) 构建版本时应用程序崩溃

ios - React Navigation 从深度链接中获取参数不起作用