2016-11-05 2 views
15

アニメーション値(fadeAnim)を状態のプロパティとして保持する方が良いですか、それともクラスプロパティにするのはいいですか?React-native:アニメーション値を状態またはクラスプロパティとして保持しますか?

例:

class ModalShade extends React.Component { 
    fadeAnim = new Animated.Value(0) 

    render() { 
     return (
      <Animated.View 
       cls="bg-black absolute-fill" 
       style={{ opacity: this.fadeAnim }} 
      /> 
     ) 
    } 

    componentDidMount() { 
     Animated.spring(
      this.fadeAnim, { 
       toValue: 0.6, 
       tension: 100, 
       friction: 20 
      } 
     ).start(); 
    } 
} 

明確化: 私は状態がの反応和解のために使用されていることを知っています。 React-native 'Animatedの値は通常のrender()をバイパスするので、状態が変化していなくてもコンポーネントは更新されます。

Animated.Valueと私のshouldComponentUpdateを比較しても意味がありません。そのため、私はそれを状態から移動しました。

+2

アニメーション値を保存するためのベストプラクティスを最終的に見つけましたか?私は同じジレンマを持っていたので私はあなたの質問に達しました。公式の文書の例ではAnimated値を保存するために州を使用していますが、それは非生産的なようです。 – scarmuega

+2

私はインスタンス変数を使用します。 –

+1

ええ、それは私にとって奇妙です。 'react-native'の公式の例では、' Animated.Value'が状態の中に保存されています。私にとっては、コンポーネントのプロパティに 'Animated.Value'が格納されていると、それらの大部分は大丈夫になるはずです。 –

答えて

0

一般に、リアクションでは、何かをインスタンス/クラスのプロパティ(例:this.myVar = 'foo';)として保存するか、または状態に保存するかの大きな違いがあります。違いは、Reactが状態オブジェクトを使用してコンポーネントを再レンダリングする(つまり、render()を再度呼び出す)ことを決定することです。

変数をクラス/インスタンスプロパティとして保存してから変更すると、リアクションレンダリングロジックはその変更について何も知らないため、レンダリングされたUIに変更が表示されません。

したがって、コンポーネントのレンダリングされた出力を変更する状態を保存する必要があります。変数がレンダリングされたすべての出力に影響を与えない場合(そして基本的に変更されたときに通知されることはありません)、インスタンス/クラスプロパティとして格納できます。その変数を更新するためにsetState呼び出しが不必要なレンダリングをトリガーするため、これはパフォーマンスの向上につながります。

あなたのケースでは、レンダリングメソッドを省略しましたが、アニメーションを実際に実行するには、状態変数fadeAnimにアクセスする必要があります。基本的に、Animated.springは時間の経過とともにいくつかの値を補間するだけですが、実際にアニメーション化するには、これらの補間値を使用する必要があります。 ドキュメントの例(https://facebook.github.io/react-native/docs/animated.html)では、this.state.fadeAnimrenderの内部で使用され、不透明スタイルを制御(アニメーション化)することがわかります。

要約すると、fadeAnimを状態に格納する必要があります。これは、値の変更によって再レンダリングが発生するためです。

+4

ありがとうございます。私はレンダリングメソッドを省略しなかった、それは上記の例にある。また、あなたの答えは一般的に真実ですが、アニメーション/反応ネイティブでは成立しません。アニメーションは 'render()'パスではなくアニメーションを開始するために 'Animated.spring'を使うことで実行されます。この仕組みはReactの調整と仮想domを回避するので、私の質問です。 –

+4

コメントありがとうございます。私はソースコードをチェックして、アニメーションはネイティブコードで実際に処理されていると言っています。https://github.com/facebook/react-native/blob/master/Libraries/Animated/src/AnimatedImplementation.js#L135あなたがしたようにそれを国外に移すことは良いアイデアのように見えると思いますが、私は本当の証拠はありません。 –

1

公式文書に従って、状態プロパティを使用する方が良いです。 そのための2つの理由があります。

  1. あなたがコンポーネントに影響を与えるすべてのものを維持したいが、あなたの状態/小道具/コンテキストで結果をレンダリングします。
  2. React-Native Animatedライブラリには、setState呼び出しを回避し、アニメーションコンポーネントの変更を再描画することを可能にする独自の最適化機能があります。これは、その依存すべてのマッピングを更新するコンポーネントマウントは、不透明度が緩和アニメーションがfadeAnimアニメーション値で開始され、その後、0に設定されている公式ドキュメント

、からの引用(ですこの場合、不透明度のみ)が値の最後の値1になります。

これは、setStateの呼び出しと再レンダリングよりも高速な最適化された方法で行われます。

+0

しかし、すべてのコンポーネントの 'shouldUpdate'の中でdeepEqualsを実行します。これは、これらのオブジェクトもまたトラバースします。 –

関連する問題