使用 React-Native 中的 Navigator 组件进行自定义导航

我正在探索 React Native 的可能性,同时在 Navigator 组件的帮助下开发一个具有自定义导航视图之间的演示应用程序。

主应用类呈现导航器,内部返回传递的组件:renderScene

class App extends React.Component {
    render() {
        return (
            <Navigator
                initialRoute={{name: 'WelcomeView', component: WelcomeView}}
                configureScene={() => {
                    return Navigator.SceneConfigs.FloatFromRight;
                }}
                renderScene={(route, navigator) => {
                    // count the number of func calls
                    console.log(route, navigator); 

                    if (route.component) {
                        return React.createElement(route.component, { navigator });
                    }
                }}
             />
        );
    }
}

目前,应用程序包含两个视图:

class FeedView extends React.Component {
    render() {
        return (
            <View style={styles.container}>
                <Text>
                    Feed View!
                </Text>
            </View>
        );
    }
}

class WelcomeView extends React.Component {
    onPressFeed() {
        this.props.navigator.push({
            name: 'FeedView',
            component: FeedView
        });
    }

    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>
                    Welcome View!
                </Text>

                <Text onPress={this.onPressFeed.bind(this)}>
                    Go to feed!
                </Text>
            </View>
        );
    }
}

我想弄清楚的是:

  • 我在日志中看到,当按“转到源”时,尽管视图正确呈现了一次,但会多次调用。这是动画的工作原理吗?renderScene

    index.ios.js:57 Object {name: 'WelcomeView', component: function}
    index.ios.js:57 Object {name: 'FeedView', component: function}
    // renders Feed View
    
  • 一般来说,我的方法是否符合 React 的方式,还是可以做得更好?

我想实现的是类似于NavigatorIOS的东西,但没有导航栏(但是有些视图将有自己的自定义导航栏)。


答案 1

您的方法应该效果很好。在 Fb 的大型应用程序中,我们避免在渲染场景组件之前调用 场景组件,这可以节省一些启动时间。require()

首次将场景推送到导航器时,应调用该函数。当导航器重新渲染时,还将为活动场景调用它。如果你在 一个 之后看到 get 被调用多次,那么它可能是一个错误。renderScenerenderScenepush

导航器仍在进行中,但是如果您发现任何问题,请在github上存档并标记我!(@ericvicenti)


答案 2

Navigator现已弃用,您可以改用来支持正在使用 的现有应用程序。RN 0.44.0react-native-deprecated-custom-componentsNavigator