2016-05-06 5 views
14

ネイティブリアクト:アニメーションを私は<code>componentDidMount</code>時におけるスライドカスタムモーダルを持っている場合に、コンポーネントアンマウント

componentDidMount() { 

    Animated.timing(this._animatedValue.y, { 
     duration: 200, 
     toValue: 0 
    }).start() 

} 

[OK]を、これは簡単でした。しかし、私はまた、コンポーネントがアンマウントするときにモーダルをスライドさせたい。私は私のアニメーションが終了するまで待つdoesntの反応するので、

componentWillUnmount() { 

    Animated.timing(this._animatedValue.y, { 
     duration: 200, 
     toValue: deviceHeight 
    }).start() 

} 

しかし、これはもちろんない仕事で行います。それは、エレガントな宣言的な方法であるとして私のために、componentWillUnmount()は、右感じるだろう。

だから現在私は、カスタム関数でこれを回避する:

closeModal() { 


    Animated.timing(this._animatedValue.y, { 
     duration: C.filterModalDuration, 
     toValue: deviceHeight 
    }).start() 

    InteractionManager.runAfterInteractions(() => { 
    this.props.UnmountThisComponent() 
    }) 

} 

これはもちろんとしてエレガントではありませんが、それは動作します。しかし、痛みは私はコンポーネントツリーに遠くダウンコンポーネントからこの関数を呼び出す必要がある場合、つまり、私は手動で再びonUnmount={()=> closeModal()}を経由して、onUnmount={this.props.onUnmount}と何度もこの機能を伝承する必要が開始されます...

次にI私はredux & redux-connectでこれを解決できると考えました。しかし、これはかなりハックと不可欠な感じ

componentWillReceiveProps (nextProps) { 

    if (nextProps.closeFilter === true) { 
      this.closeModal() 
    } 

} 

:私は、このようなcomponentWillRecieveProps()を経由して関数を呼び出します子コンポーネントからReduxの状態変化をトリガするために考えていました。

エレガントな/宣言的な方法でこの問題を解決する方法はありますか?

+0

これに関するアップデートはありますか?私は今この同じ状況にいる。私はこのInteractionManagerなどが何であるかわからないので、アップデートがあなたのコード解説のビットをもっと広げることができないならば:D –

+0

私の側からの更新はありません。対話マネージャは、アニメーションが完了した後、最初にコールバックを実行します。通常は、そのコールバック内に高価な同期タスクを配置します。アニメーションと高価なタスクを同時に実行すると、アニメーションはジャッキーになります。 (最近のバージョンのreactネイティブでリリースされたアニメーション用のネイティブドライバを使用しない限り、アニメーションは別のスレッドで実行されます)。詳細はこちら:https://facebook.github.io/react-native/docs/interactionmanager.html – ThorbenA

+0

プロジェクトで 'Navigator'を使用していますか?それで、私たちは入力/終了ビューでアニメーションを(トランジションで)行います。 – Lucas

答えて

4

アニメーションが完了した後にInteractionManager.runAfterInteractionsを実行することはできません。 startコールバックの使用をお勧めします。

Animated.timing(this.animatedValue, {}).start(() => this.props.closeModal())

あなたが深いアニメーションを調整し、アップ反撃することができますhttps://github.com/mosesoak/react-native-conductorのようなものがあります。これはcontextを利用しています。

お使いのようにreduxを使用することもできますが、componentWillReceivePropsではなくcomponentDidUpdateを使用します。

理由は、あなたがあなたのcomponentWillReceivePropsを持っているコンポーネントでsetStateを引き起こすだけで安全であるということである。

あなたがcomponentWillReceivePropsの内側に、それは他のコンポーネントでsetStateの原因となりますdispatchアプリケーションが破損する原因となり引き金場合。

全体:このフローをお勧めします。 start(() => {})コールバックでsetStateが発生するか、reduxストアのデータを設定して、次にunmountのモーダルが非表示になります。

この方法でアンマウントアニメーションを取得できます。

react-navigationのようなルーティングを使用している場合は、mode: "modal"ナビゲーションスタイルを設定することをおすすめします。そうすることで、アンマウント/マウントモーダルアニメーションがあなたのために処理されます。

2

componentWillReceivePropsは、次の小道具に基づいて行動をとることが意図されているように完全に適合しているようです。これは、親が子どもの行動を誘発したいときに理想的です(これは実際には、子どもが親の機能と呼ぶReactのパターンではなく、両親は子どもからのイベントを受け取ります)。

+0

これは正しいです! – Annihil

関連する問題