167

componentを使用してビュー間のカスタム ナビゲーションを備えたデモ アプリを開発しながら、 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 });
                    }
                }}
             />
        );
    }
}

今のところ、アプリには 2 つのビューが含まれています。

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と、ビューが 1 回正しくレンダリングされるにもかかわらず、複数回呼び出されることがわかります。それはアニメーションの仕組みですか?

    index.ios.js:57 Object {name: 'WelcomeView', component: function}
    index.ios.js:57 Object {name: 'FeedView', component: function}
    // renders Feed View
    
  • 一般的に、私のアプローチは React の方法に準拠していますか、それともより適切に行うことができますか?

私が達成したいのはNavigatorIOS、ナビゲーションバーのないものと似ています (ただし、一部のビューには独自のカスタムナビゲーションバーがあります)。

4

4 に答える 4

78

あなたのアプローチはうまくいくはずです。Fb の大きなアプリでは、require()レンダリングするまでシーン コンポーネントの を呼び出さないようにしています。これにより、起動時間を少し節約できます。

このrenderScene関数は、シーンが最初にナビゲーターにプッシュされたときに呼び出される必要があります。また、ナビゲーターが再レンダリングされるときに、アクティブなシーンに対しても呼び出されます。renderSceneの後に get が複数回呼び出される場合pushは、おそらくバグです。

ナビゲーターはまだ開発中ですが、問題が見つかった場合は、github にファイルしてタグ付けしてください。(@ericvicenti)

于 2015-05-02T02:19:19.767 に答える
2

他の人が以前に述べたように、Navigator は v0.44 から廃止されましたが、古いアプリケーションをサポートするためにインポートすることができます:

Navigator は、バージョン 0.44 でコアの React Native パッケージから削除されました。モジュールは、 下位互換性を維持するために、アプリケーションでインポートできるreact-native-custom-componentsパッケージに移動されました。

Navigator の元のドキュメントを表示するには、古いバージョンのドキュメントに切り替えてください。

ドキュメント (React Native v0.54) Navigating Between Screens に従ってください。始めたばかりの場合はReact Navigationを使用することをお勧めします。Android 以外のアプリケーションにはNavigatorIOSを使用することをお勧めします。

ナビゲーションを始めたばかりの場合は、おそらくReact Navigationを使用することをお勧めします。React Navigation は、iOS と Android の両方で共通のスタック ナビゲーションとタブ付きナビゲーション パターンを表示する機能を備えた、使いやすいナビゲーション ソリューションを提供します。

...

iOS のみをターゲットにしている 場合は、ネイティブの UINavigationController クラスのラッパーを提供するため、最小限の構成でネイティブのルック アンド フィールを提供する方法としてNavigatorIOSも確認することをお勧めします。

NB:この回答を提供した時点で、React Nativeはバージョン0.54でした

于 2018-04-01T00:52:58.013 に答える