2016-09-05 4 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

고맙습니다 만, 아니요. 정확하게 두 가지 이유로 필요한 것은 아닙니다. 1. 각 render() 호출이 애니메이션을 적용 할 것입니다. 항목이 백엔드에서 반환 될 때만 애니메이션을 적용하려고합니다 (따라서 "항목"이 채워짐). 만약 render()가 다시 호출된다면 애니메이션을 원하지 않지만, 그냥 렌더링 2. 각 타일을 움직이기 원하지만, 애니메이션은 무작위로 시작해야합니다. 사용자 (무작위로 할당 할 2-3 개의 클래스가 충분할 것입니다). 어려운 점은 첫 번째 것입니다. – Bertuz

+0

'render '가 여러 번 호출 될 수 있다는 것을 알면 매우 실망 할 것입니다. Redux를 사용하고'console.log'를'render'에 넣으면 DOM이 완전히 준비된 순간까지 콘솔에서 4-5 번 메시지를 볼 수 있습니다. 이것이 Ido가 'componentDidMount'에서 애니메이션을 시작한 이유입니다. 즉, 해당 DOM이 렌더링 된 후 한 번만입니다. –

+0

필요에 따라 답을 수정했습니다 : – Ido

1

당신은 작업 velocity.js의 파상 기능을 사용할 수 있습니다 또는 당신은 자신에 의해 비슷한 쓰기 : 같은 유형 {divElement, timeout}의 요소로 채워집니다 별도의 배열을 만들 -하자가이 배열 pairs 전화 (채우기 위해 그것은 원래의 배열을 가로 지르고 0 < 2mins 범위 내의 타임 아웃을 모든 요소에 할당합니다.) 그리고 렌더 함수 (원본이 아닌)에서 사용하려는 빈 배열 인 newArray을 할당합니다. 당신이 당신의 pairs 배열이 준비되면, 그것을 통과하고 각 요소에 대해이 함수를 호출 :

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

을하고 그것을, 당신은 (내가 생각 배열을 jsx에 매핑) 바로 newArray의 내용을 렌더링하고 결국 도착 당신이 처음에 가진 모든 사업으로 가득 찼습니다.

+0

무작위로 만들려면'timeout'에'Math.random()'을 곱하십시오. –

관련 문제