2017-11-20 8 views
1

私はReact NativeプロジェクトにReact Navigationライブラリを使用しており、状態の処理方法を理解するのに苦労しています。 通常のReactネイティブアプリケーションでは、トップレベルのコンポーネントに状態を持ち、子コンポーネントからのイベントをポップすることができますが、React Navigationではスクリーンとして使用されるコンポーネントには何も渡すことができないようです。リビジョンなしでナビゲーションナビゲーション状態管理に反応

related GitHub issueて読んだ後、それはライブラリの開発者は、グローバルイベントハンドラのいくつかの種類を使用するすべての人を強制的に非常に独断いるようだ - Reduxのかmobxを、私は推測します。

The handlerこれは、次のように変更する必要があります。state

  1. ハンドラーをTaskFormコンポーネントに渡して、アプリケーション内で状態を移動しようとしたときに固まった。その

は、「ただReduxのを使用し、」返信避けてくださいApp.jsの一部としてレンダリングされた場合

  • は、タスクリストに小道具として状態を渡します。私は、この例でreduxを使用することは大規模な過度の攻撃であると信じています。

  • +0

    あなたのコードの 'Home'と' TaskForm'は兄弟です。あなたが他の州の状態を変更したい場合は、共通の祖先がその状態を共有する必要があります。あなたの場合は 'PluralTodo'です。おそらくPluralTodoのrenderメソッドの中で 'StackNavigator'関数を呼び出してナビを初期化し、そこにハンドラ/状態を渡すことができます – azium

    +0

    それはまさに問題です。私はハンドラを渡す方法がわからず、そこには – mfilimonov

    +1

    のようなものがありますか? – azium

    答えて

    0

    に動作しますが、コミュニティの問題を反応させると、非常に簡単な例を見つけましたラッパー関数を使用します。

    これは驚くほどです。simple solutionと私はなぜそれについて前に考えなかったのか分かりません。 この機能は次のとおりです。 const createComponent = (instance, props) => navProps => React.createElement(instance, Object.assign({}, props, navProps)); 私はこの解決策を見つけるためにインスピレーションを与えてくれてありがとうございます。

    2

    私は反応しないネイティブと反応するナビゲーションを私のアプリで使っていますが、これまでのところうまくいっています。そのトリックは、screenPropsを一番下に通しています。

    たとえば、私は詳細ビューを持っています。

    export default class MoreExport extends Component { 
        static navigationOptions = { 
         title: "More" 
        } 
    
        render() { 
         return <MoreStack screenProps={this.props.screenProps} />; 
        } 
    } 
    
    :私はエクスポートするラッパークラスを作成

    const MoreStack = StackNavigator({ 
    More: { 
        screen: More 
    }, 
    SubView1: { 
        screen: SubView1, 
    }, 
    ... 
    }, options); 
    

    そして:その後、私は、スタックを作成

    class More extends Component { 
        render() { 
         return <something> 
        } 
    } 
    
    class SubView1 extends Component {...} 
    class SubView2 extends Component {...} 
    

    :私は、スタック内の2つのサブビューの基本的な詳細ビューを作成します

    これがMore.jsにある場合は、More.jsからMoreをインポートし、それ以外の場所で使用することができます。

    次に、screenPropsをルートビューに渡してから各レイヤーのラッパークラスを作成すると、screenPropsをすべて終了し、すべてのビューはthis.props.screenPropsを使用してアクセスできます。

    上記のようなラッパーを各StackNavigatorとTabNavigatorの周りに使用し、screenPropsは一番下まで渡します。例えば

    は、私のルートクラスのメソッドをレンダリングするには、私が行うことができます:

    return <More screenProps={{prop1: something, prop2: somethingElse}} /> 
    

    そしてMoreStackでより多くのクラスと、各サブビューは、これらすべての小道具へのアクセスを持っているでしょうし。

    詳細をご希望の場合はお気軽にお問い合わせください。

    免責事項:これはそれを行うには正しいか、推奨される方法であれば、私は知りませんが、それは、私はもっと周りを見回したsteffeydevに触発された後

    +0

    私のアプリを反応ナビゲーションに変換したとき、私は基本的にこれらのラッパーを作って、これのインスタンスを置き換えました。(メインスクリーン{props => steffeydev

    +0

    内部に何があるかの例を表示できますか?Moreレンダー?異なるサブビュー間で切り替えるために、内部に何をレンダリングするのか分かりません。私のビューをあなたのラッパーを使用するように変換する – mfilimonov

    +0

    内部は何ですか?レンダリングは何でもできます。私はthis.props.navigation.navigate( "SubView1")を呼び出すボタンがいくつかあり、StackNavigatorがスタックにポップを処理します。 – steffeydev

    関連する問題