Пользовательская навигация с компонентом Навигатор в React-Native

Я изучаю возможности 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>
        );
    }
}

То, что я хочу выяснить, это:

  • Я вижу в журналах, что при нажатии "go to feed" 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() для компонента сцены, пока мы не отобразим его, что может немного сократить время запуска.

Функция renderScene должна вызываться, когда сцена сначала помещается в навигатор. Он также будет вызван для активной сцены, когда Navigator получит повторную визуализацию. Если вы видите, что renderScene вызывается несколько раз после push, то это, вероятно, ошибка.

Навигатор по-прежнему работает, но если вы обнаружите какие-либо проблемы с ним, напишите на github и пометьте меня! (@ericvicenti)

Ответ 2

Navigator теперь не используется в RN 0.44.0, вы можете использовать react-native-deprecated-custom-components вместо этого для поддержки существующего приложения, использующего Navigator.

Ответ 3

Компонент навигатора устарел. Вы могли бы использовать response-native-router-flux by askonov, он имеет огромное разнообразие, поддерживает множество различных анимаций и эффективен

Ответ 4

Как уже упоминалось ранее, Navigator устарел с версии 0.44, но все еще может быть импортирован для поддержки более старых приложений:

Навигатор был удален из основного пакета React Native в версии 0.44. Модуль был перемещен в пакетact-native-custom-components, который может быть импортирован вашим приложением для обеспечения обратной совместимости.

Чтобы увидеть исходные документы для Navigator, перейдите на более старую версию документов.

В соответствии с документами (React Native v0.54) Навигация между экранами. Теперь рекомендуется использовать React Navigation, если вы только начинаете, или NavigatorIOS для приложений, отличных от Android

Если вы только начинаете навигацию, вам, вероятно, захочется использовать React Navigation. React Navigation предоставляет простое в использовании навигационное решение с возможностью представления общей навигации стека и шаблонов навигации с вкладками на iOS и Android.

...

Если вы ориентируетесь только на iOS, вы можете также проверить NavigatorIOS как способ предоставления собственного внешнего вида с минимальной конфигурацией, поскольку он предоставляет оболочку для собственного класса UINavigationController.

Примечание: на момент предоставления этого ответа React Native был версии 0.54.