2016-05-06 18 views
14

मैं जो componentDidMount पर स्लाइड एक कस्टम मॉडल है जब:मूल निवासी प्रतिक्रिया: एनिमेशन घटक unmounts

componentDidMount() { 

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

} 

ठीक है, यह आसान था। हालांकि, जब घटक अनमाउंट करता है तो मैं मोडल को स्लाइड करना भी पसंद करता हूं। मेरे लिए, componentWillUnmount() सही लगेगा के रूप में यह एक सुंदर कथात्मक तरीका है,:,

componentWillUnmount() { 

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

} 

लेकिन इस पाठ्यक्रम नहीं काम का है, क्योंकि इंतजार नहीं करता जब तक मैं अपने एनीमेशन समाप्त कर दिया है प्रतिक्रिया।

तो वर्तमान में मैं एक कस्टम समारोह के साथ इस को हल करने के:

closeModal() { 


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

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

} 

इस कोर्स सुरुचिपूर्ण के रूप में नहीं की है, लेकिन यह काम करता है। हालांकि, दर्द शुरू होता है अगर मैं एक घटक से इस समारोह में दूर के घटक पेड़ में नीचे कॉल करने के लिए की जरूरत है, यानी मैं मैन्युअल रूप से नीचे onUnmount={this.props.onUnmount} बार बार साथ onUnmount={()=> closeModal()} के माध्यम से इस समारोह को पारित और फिर ...

फिर जरूरत है मैं सोचा कि मैं इसे Redux & रेडक्स-कनेक्ट के साथ हल कर सकता हूं। मैं बच्चे के घटक है, जो तब componentWillRecieveProps() इस तरह के माध्यम से समारोह कहेंगे से एक redux स्थिति परिवर्तन को गति प्रदान करने में सोच रहा था:

componentWillReceiveProps (nextProps) { 

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

} 

हालांकि यह बहुत hacky और जरूरी लगता है।

क्या इस समस्या को एक सुरुचिपूर्ण/घोषणात्मक तरीके से हल करने का कोई तरीका है?

+0

इस पर कोई अपडेट? मैं फिलहाल इसी स्थिति में हूं। यदि कोई अपडेट आपके कोड स्पष्टीकरण को और अधिक विस्तारित नहीं कर सकता है क्योंकि मुझे नहीं पता कि यह इंटरैक्शन मैनेजर आदि क्या है: डी –

+0

मेरी तरफ से कोई अपडेट नहीं। एक एनीमेशन पूरा होने के बाद इंटरैक्शन मैनेजर पहले कॉलबैक निष्पादित करेगा। आप आमतौर पर उस कॉलबैक के अंदर महंगा सिंक्रोनस कार्य डाल देंगे। यदि आप एक ही समय में एनीमेशन और महंगी कार्य निष्पादित करेंगे, तो एनीमेशन जंकी होगा। (जब तक आप एनीमेशन के लिए देशी ड्राइवर का उपयोग नहीं करते हैं जो प्रतिक्रिया मूल के हाल के संस्करणों में जारी किया गया है, जो एक अलग थ्रेड पर एनिमेशन निष्पादित करेगा)। यहां और देखें: https://facebook.github.io/react-native/docs/interactionmanager.html – ThorbenA

+0

क्या आप अपनी प्रोजेक्ट में 'नेविगेटर' का उपयोग कर रहे हैं? इस तरह हम प्रवेश/निकास दृश्यों पर एनिमेशन (संक्रमण में) करते हैं। – Lucas

उत्तर

4

मैं एनीमेशन पूर्ण होने के बाद निष्पादित करने के लिए InteractionManager.runAfterInteractions का उपयोग नहीं करता। मैं start कॉलबैक का उपयोग करने की सलाह देता हूं।

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

वहाँ https://github.com/mosesoak/react-native-conductor तरह बातें जो आप गहरी एनिमेशन समन्वय और वापस ऊपर आग में मदद कर सकते हैं। यह context का लाभ उठाता है।

आप रेडक्स का भी उपयोग कर सकते हैं जैसा कि आपने कोशिश की है, हालांकि मैं componentWillReceiveProps के बजाय componentDidUpdate का उपयोग करूंगा।

कारण यह है कि यह घटक में एक setState पैदा करने के लिए आप अपने componentWillReceiveProps में है ही सुरक्षित है।

आप को गति प्रदान एक dispatchcomponentWillReceiveProps के अंदर यह अन्य घटकों में एक setState कारण होगा कारण आपके आवेदन को तोड़ने के लिए हैं ।

कुल मिलाकर: मैं इस प्रवाह की अनुशंसा करता हूं। (बंद करें क्रिया आरंभ) =>start(() => {}) कॉलबैक में कॉलबैक का कारण बनता है या redux स्टोर में डेटा का एक टुकड़ा सेट करता है जो unmount आपके मोडल जो अब छिपा हुआ है, को एनिमेट करें।

इस तरह आप अनमाउंट एनीमेशन प्राप्त करते हैं।

यदि आप react-navigation जैसे रूटिंग का उपयोग कर रहे हैं तो मैं mode: "modal" नेविगेशन शैली सेट करने की अनुशंसा करता हूं। इस तरह unmounting/बढ़ते मोडल एनिमेशन आपके लिए ख्याल रखा जाता है।

2

componentWillReceiveProps पूरी तरह से फिट लगता है क्योंकि इसका इरादा अगले प्रोप के आधार पर कार्य करना है। यह आदर्श है जब माता-पिता अपने बच्चों पर कार्रवाई शुरू करना चाहते हैं (यहां तक ​​कि वास्तव में यह वास्तव में प्रतिक्रिया का पैटर्न नहीं है जहां बच्चे माता-पिता के काम करते हैं, और माता-पिता बच्चों से घटनाएं प्राप्त करते हैं)।

+0

यह सही है! – Annihil

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