5

मैं सोच रहा था कि कोई भी React.js के साथ एनिमेटेड घटक/पृष्ठ स्विच को कैसे प्राप्त करें के बारे में कुछ अंतर्दृष्टि प्रदान कर सकता है।प्रतिक्रिया: पृष्ठ स्विच को एनिमेट करना

जो मैं प्राप्त करना चाहता हूं वह http://www.semplicelabs.com/ पर एक घटक/पृष्ठ संक्रमण है - एक हेडर जो अस्पष्टता और मार्जिन-टॉप को बदलता है और एक ऐसी सामग्री जो अस्पष्टता को बदलता है।

जब एक नया घटक/पेज दिखाया गया है, वर्तमान में प्रदर्शित घटक/पृष्ठ की से पहले में नए घटक/पेज संक्रमण प्रारंभ कर देना चाहिए क्या मैं अब तक एक LayoutComponent कि एक CSSTransitionGroup में एक पेज घटक renders है।:

import React from 'react/addons'; 

export default class LayoutComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { page: '' }; 
    }, 

    setPage(page) { 
    this.setState({ page }); 
    } 

    render() { 
    return (
     <React.addons.CSSTransitionGroup transitionName='page'> 
     {this.state.page} 
     </React.addons.CSSTransitionGroup> 
    ); 
    } 
} 

मैं भी दो पृष्ठ के घटकों FirstPage और SecondPage है।

import React from 'react'; 

export default class FirstPage extends React.Component { 
    render() { 
    return (
     <div> 
     <header className='header'> 
      <div className='container'> 
      First Header 
      </div> 
     </header> 
     <div className='content'> 
      <div className='container'> 
      First Content 
      </div> 
     </div> 
     </div> 
    ); 
    } 
} 

SecondPage कोड और FirstPage कोड के बीच अंतर केवल .container divs में सामग्री और कक्षाओं नाम हैं।

मैंने जो करने की कोशिश की है वह .8s अवधि के साथ एक छुट्टी संक्रमण जोड़ें और .8s अवधि और देरी दोनों के साथ एक प्रवेश संक्रमण जोड़ें। मुख्य समस्या जो मैं देखता हूं वह यह है कि पुराने पृष्ठ की छुट्टी संक्रमण समाप्त होने से पहले नया पृष्ठ घटक घुमाया जाता है। यह मेरा वर्तमान सीएसएस है:

.page-enter { 
    background-color: #f2f2f2; 
    transition: background-color .8s linear .8s; 
} 

.page-enter-active { 
    background-color: #f2f1f1; 
} 

.page-leave { 
    background-color: #f2f1f1; 
    transition: background-color .8s linear; 
} 

.page-leave-active { 
    background-color: #f2f2f2; 
} 

.page-enter .header { 
    margin-top: -80px; 
    opacity: 0; 
    transition: opacity .8s ease-in-out .8s; 
    transition: margin-top .8s ease-in-out .8s; 
} 

.page-enter-active .header { 
    margin-top: 0; 
    opacity: 1; 
} 

.page-leave .header { 
    margin-top: 0; 
    opacity: 1; 
    transition: opacity .8s ease-in-out; 
    transition: margin-top .8s ease-in-out; 
} 

.page-leave-active .header { 
    margin-top: -80px; 
    opacity: 0; 
} 

.page-enter .content { 
    opacity: 0; 
    transition: opacity .8s ease-in-out .8s; 
} 

.page-enter-active .content { 
    opacity: 1; 
} 

.page-leave .content { 
    opacity: 1; 
    transition: opacity .8s ease-in-out; 
} 

.page-leave-active .content { 
    opacity: 0; 
} 

मैं जानता हूँ कि मैं प्रारंभिक transitionAppear={true} साथ बढ़ते चेतन सकता है - लेकिन इससे पहले वर्ष एक बाहर का संक्रमण हो जाने घुड़सवार किया जा रहा नए घटक की समस्या से मदद नहीं करता है।

यह एक समस्या है जिसे मैंने कुछ दिनों तक संघर्ष किया है और मुझे कोई समाधान नहीं मिल रहा है।

के साथ चारों ओर खेलने के लिए कुछ कोड: https://jsfiddle.net/gonsfx/xva2g6oo/

+1

क्या आप इसे हल करने में सक्षम हैं? मैं भी इस मुद्दे से फंस गया हूँ। –

उत्तर

1

मैं एक opacity (एनीमेशन के लिए) को बचाने के लिए पृष्ठों के लिए एक राज्य को शामिल किया है और 1 (प्रारंभिक = 0) के लिए सेट जब घटक के साथ माउंट किया एक छोटी देरी इसलिए मैंने प्रत्येक पृष्ठ में दो फ़ंक्शन जोड़े।

componentDidMount() { 
    setTimeout(() => { 
     this.setState({ 
      opacity: 1 
     }); 
    }, 20); 
} 

getStyle() { 
    return { opacity: this.state.opacity }; 
} 

तब मैं प्रारंभिक सामान बनाने के लिए एक निर्माता जोड़ा ....

constructor(props) { 
    super(props); 
    this.state = { opacity: 0 }; 
    this.getStyle = this.getStyle.bind(this); 
    this.componentDidMount = this.componentDidMount.bind(this); 
} 

Here एक डेमो है।

घटक तुरंत पृष्ठ पर दिखाई देंगे, इसलिए मुझे लगता है कि एक फीका एनीमेशन बनाना संभव नहीं है (कम से कम, मुझे इसके लिए कोई समाधान नहीं मिला)।

+0

यह नया दिखाए जाने से पहले पुराने पृष्ठ को फीका नहीं करता है। साथ ही, यह पूरी तरह से 'CSSTransitionGroup' को छोड़ देता है। हालांकि, आपके प्रयास के लिए धन्यवाद। – Codepunkt

0

ठीक है। बहुत से नवीनतम और पुराने दस्तावेज़ों के माध्यम से wading के बाद, मैं इसे काम करने में कामयाब रहे। Here is the solution

असल में, प्रतिक्रिया-राउटर केवल माता-पिता कंटेनर की एनीमेशन के साथ ही चिंतित है। लेकिन इसका मतलब है कि ReactTransitionGroup का उपयोग करके, हम बाहर निकलने वाले घटक में componentWillLeave विधि में हुक कर सकते हैं, जहां हम अलग-अलग बच्चों को कुशल बना सकते हैं। appear संक्रमण की सुविधा के लिए बच्चों के घटक ReactCSSTransitionGroup भी खेल सकते हैं।

तो आप केवल CSSTransitionGroup का उपयोग करने में सक्षम नहीं हो सकते हैं, लेकिन CSSTransitionGroup और TransitionGroup का मिश्रण नहीं कर सकते हैं।

इस प्रकार, एक पृष्ठ को बदलने से बच्चे को हुक के माध्यम से स्वचालित रूप से एनिमेट कर दिया जाएगा, जबकि पृष्ठ दर्ज करते समय व्यक्तिगत एनिमेशन के लिए CSSTransitionGroup का उपयोग किया जाएगा।

समाधान में setTimeout एक हैक जैसा प्रतीत हो सकता है, लेकिन यह सब मैं अभी करने में सक्षम हूं।

संबंधित मुद्दे