如何将对Navigator的引用传递给renderScene?

Chr*_*ris 5 javascript react-native

我一直在尝试使用React Native,我无法将对导航器的引用传递到我正在渲染的场景中.没有导航器,NewsList项目不能触发场景更改.

render: function() {
    return (
        <Navigator
            initialRoute={ { name: 'NewsList', index: 0 } }
            renderScene={ ( route, navigator ) => NewsList }
        />                                                      
    );                                                          
},
Run Code Online (Sandbox Code Playgroud)

类似地,在渲染场景功能中,我需要将导航器传递给行渲染功能.

<UIExplorerPage noSpacer={true} noScroll={true}>
    <ListView
        dataSource={this.state.dataSource}
        renderRow={this._renderRow}
        onEndReached={this.onEndReached}
    />
</UIExplorerPage>
Run Code Online (Sandbox Code Playgroud)

传递这样的引用的惯用方法是什么?

Sre*_*nan 9

像Colin提到的那样,你需要将回调传递给你的列表项.下面给出的是来自示例项目(UIExplorer)的代码本身反应本身.

在这里,我们将navigator对象传递给NavMenu,它是列表组件.

var TabBarExample = React.createClass({
    // Other methods... blah blah
    renderScene: function(route, nav) {
        switch (route.id) {
          case 'navbar':
            return <NavigationBarSample navigator={nav} />;
          case 'breadcrumbs':
            return <BreadcrumbNavSample navigator={nav} />;
          case 'jumping':
            return <JumpingNavSample navigator={nav} />;
          default:
            return (
              <NavMenu
                message={route.message}
                navigator={nav}
                onExampleExit={this.props.onExampleExit}
              />
            );
        }
    },

    render: function() {
        return (
          <Navigator
            style={styles.container}
            initialRoute={{ message: "First Scene", }}
            renderScene={this.renderScene}
            configureScene={(route) => {
              if (route.sceneConfig) {
                return route.sceneConfig;
              }
              return Navigator.SceneConfigs.FloatFromBottom;
            }}
          />
        );
      }
});
Run Code Online (Sandbox Code Playgroud)

在NavMenu组件中,我们在onPress每个NavButton 上传递回调.

class NavMenu extends React.Component {
  render() {
    return (
      <ScrollView style={styles.scene}>
        <Text style={styles.messageText}>{this.props.message}</Text>
        <NavButton
          onPress={() => {
            this.props.navigator.push({
              message: 'Swipe right to dismiss',
              sceneConfig: Navigator.SceneConfigs.FloatFromRight,
            });
          }}
          text="Float in from right"
        />
        <NavButton
          onPress={() => {
            this.props.navigator.push({
              message: 'Swipe down to dismiss',
              sceneConfig: Navigator.SceneConfigs.FloatFromBottom,
            });
          }}
          text="Float in from bottom"
        />
        // Omitted rest of the NavButtons.
      </ScrollView>
     );
}
Run Code Online (Sandbox Code Playgroud)

这是示例的链接.

  • 字面上花了好几个小时,这个答案非常明确,谢谢你把我从导航器里拯救出来,导航员需要一篇博文来教人们如何使用它 (3认同)

Col*_*say 4

如果我正确理解您的问题,您的意思是您的新闻列表项组件需要引用导航器才能触发导航事件。这(IMO)是错误的做法。

相反,向列表项传递回调。回调是父新闻列表组件上的一个方法,并且已经具有对您可以调用的导航器的引用。通过这种方式,您可以避免将导航器一直传递到组件层次结构中。

如果不清楚的话我可以给出一个代码示例:)