2016-09-05 1 views
2

私はバックエンドから返されるアイテムのリストを持っています。各アイテムはdivによって一種のタイルを形成しています。レンダリングされたばかりでなく、個別にアニメーション化したいと思います。問題は、アイテムがすべて一緒に返され、レンダリング関数がそれらをすべて一緒にレンダリングすることです。そのため、CSSのアニメーションはすべてのタイルで同時に表示されますが、私が望むのはすべてのタイルに「ランダム」なバウンス効果があることです。各タイルは2秒以内に表示されますが、ランダムに表示されます。各divを一度にアニメーション化する方法

これは可能ですか?

答えて

0
class AnimateItemComponent extends React.Component 
{ 
    static propTypes = 
    { 
     animate: React.PropTypes.bool 
    }; 

    render() 
    { 
     let aniamte = this.props.aniamte; 
     let style = {}; 
     let className = ["item-class"]; 
     let time = parseInt(Math.random() * 2000); // Maximum of 2 seconds 

     if (aniamte) 
     { 
      // Consider support more prefixes 
      style.animationDelay = time + "ms"; 
     } 

     if (this.props.active) 
      className.push("animate"); // Class the activate the animation 

     return React.createElement("div", {className, style}, "My text"); 
    } 
} 

class AnimateComponent extends React.Component 
{ 
    constructor() 
    { 
     this.state = {}; 

     // Initialize the value to keep the prop types boolean 
     this.state.aniamte = false; 

     // Our items to handle, can be easily replaced with the setState. 
     this.state.items = ["a", "b", "c", "d", "e"]; 
    } 

    render() 
    { 
     let content = []; 
     let items = this.state.items; 
     let aniamte = this.state.aniamte; 

     content = items.map(item => 
     { 
      return React.createElement(AnimateItemComponent, {animate}); 
     }); 

     return content; 
    } 

    startAnimation() 
    { 
     this.setState({aniamte: true}); 
    } 

    stopAnimation() 
    { 
     this.setState({aniamte: false}); 
    } 

    serverRequest() 
    { 
     // Activate animation: 
     this.startAnimation(); 

     // Stop animation 
     this.stopAnimation(); 
    } 
} 
+0

ありがとうございます。しかし、それは私が2つの理由から必要としているものではありません。1.各render()呼び出しはそれらをアニメーション化します。アイテムがバックエンドから戻ったときに、それらをアニメーション化したい(したがって、 "アイテム"がいっぱいです)。 render()が再び呼び出された場合、私はそれらのアニメーションを望んでいませんが、ただレンダリングしました2.それぞれの*タイルをアニメーション化したいのですが、アニメーションはランダムに開始する必要があります。ユーザー(ランダムに割り当てられる2〜3クラスは十分以上のものです)。難しい点は最初のものです:) – Bertuz

+0

あなたは 'レンダリング'が何度も何度も呼び出すことができることを知って非常に失望します。 Reduxを使用し、 'console.log'を' render'の中のどこかに置いた場合、DOMが完全に準備された瞬間に、コンソール上でメッセージを4〜5回見ることができます。このため、Idoは 'componentDidMount'でアニメーションを開始します。つまり、対応するDOMがレンダリングされてから1回だけです。 –

+0

あなたのニーズに合わせて答えを更新しました: – Ido

1

あなたは仕事のためにvelocity.jsのスタガー機能を使用することができます。また、自分で似た何かを書く:そのようなタイプ{divElement, timeout}の要素で満たされる個別の配列を作成 - レッツは、この配列pairsを呼び出す(埋めるために元の配列を走査し、すべての要素に0〜2/の2分の範囲内でタイムアウトを割り当てます)、レンダリング関数(元の配列ではなく)で使用する空の配列 - newArrayを割り当てます。あなたはpairs配列を用意して、それを横断し、各要素に対してこの関数を呼び出した後:

pairs.forEach(({divElement, timeout})=> { 
     setTimeout(()=>{ 
     newArray.push(divElement) 
     }, timeout) 
}) 

、それはそれだ、あなたはすぐにnewArrayの内容をレンダリングする(私は仮定の配列をJSXにマッピングし)、それが最終的に取得しますあなたが最初に持っていたすべての部署でいっぱいになりました。

+0

ランダムにするには 'timeout'に' Math.random() 'を掛けます。 –

関連する問題