2015-09-09 4 views
7

मैं पुलडाउन मेनू का निर्माण कर रहा हूं प्रतिक्रिया घटक जो उपयोगकर्ता को के बाहर DOM में कहीं भी क्लिक करता है।मैं एक प्रतिक्रिया घटक के भीतर से बॉडी में क्लिक हैंडलर कैसे जोड़ सकता हूं?

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

वहाँ एक प्रतिक्रिया के भीतर से body तत्व को एक श्रोता संलग्न करने के लिए कोई तरीका है घटक? या मुझे बस jQuery का उपयोग करना चाहिए? (मैं प्रतिक्रिया और jQuery मिश्रण करने से थोड़ा सावधान हूं।)

+1

क्या आप सिर्फ डोम का उपयोग नहीं कर सकते? इस तरह: 'document.body.addEventListener ('क्लिक करें', फ़ंक्शन (evt) {// हैंडल!})' – bmceldowney

+0

मैं घटकडिडमाउंट का प्रयास करता हूं, उसके बाद उस सुझाव के ऊपर टिप्पणी का उपयोग करें। संपादित करें - क्या @limelights ने कहा;) – Mintberry

+0

संभावित डुप्लिकेट : http://stackoverflow.com/questions/32553158/detect-click-outside-react-component –

उत्तर

15

प्रतिक्रिया सिर्फ जावास्क्रिप्ट है इसलिए किसी भी तत्व को क्लिक हैंडलर को जोड़ने से addEventListener() का उपयोग करके सामान्य के रूप में सामान्य किया जाता है। componentDidMount में ऐसा करना आमतौर पर जोड़ा गया ईवेंट हैंडलर हटाकर componentWillUnmount में अपने आप के बाद बहुत अच्छा और साफ और साफ हो जाता है।

var Component = React.createClass({ 
    componentDidMount: function() { 
     document.body.addEventListener('click', this.myHandler); 
    }, 
    componentWillUnmount: function() { 
     document.body.removeEventListener('click', this.myHandler); 
    }, 
    myHandler: function() { 
     alert('click'); 
    }, 
    render: function() { 
     return <div>Hello {this.props.name}</div>; 
    } 
}); 
+3

ठीक है। विज्ञापित के रूप में काम करता है। एकमात्र (नई) समस्या यह है कि डीओएम तत्व पर जेएस में प्रचार रोकना भी बच्चों के तत्वों में सक्रिय घटनाओं को रोकता है, जो पहले घटना प्राप्त कर लेना चाहिए। 'दस्तावेज़' से प्रतिनिधि घटनाओं के प्रतिनिधि होने के कारण। http://stackoverflow.com/a/24421834/698511 – Tim

+1

दुर्भाग्यवश मैंने देखा है कि इस समाधान के परिणामस्वरूप आपके उपयोग के मामले में वास्तव में समस्या हो सकती है। प्रतिक्रिया घटनाओं के क्षेत्र में रहने के लिए, मैं प्रतिक्रिया के भीतर शीर्ष स्तर पर ऐप स्थिति प्रबंधित करने और कार्रवाई के लिए असंबंधित घटकों के अत्यधिक पुन: प्रस्तुत करने से बचने के लिए 'mustComponentUpdate' के उचित उपयोग का चयन करने का विकल्प चुनूंगा। – Trace

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