मैं एक स्क्रिप्ट लिख रहा हूं जो ड्रॉपडाउन की ऊंचाई या स्क्रीन पर इनपुट की स्थिति के आधार पर ड्रॉपडाउन से ऊपर या ऊपर ले जाता है। इसके अलावा, मैं अपनी दिशा के अनुसार मॉडिफायर को ड्रॉपडाउन पर सेट करना चाहता हूं। लेकिन एक अनंत लूप बनाता है (जो स्पष्ट है) के setState
अंदर उपयोग करनाcomponentDidUpdate
मैंने getDOMNode
सीधे ड्रॉपडाउन के लिए क्लासनाम का उपयोग करने और स्थापित करने में एक समाधान पाया है , लेकिन मुझे लगता है कि रिएक्ट टूल का उपयोग करके एक बेहतर समाधान होना चाहिए। कोई भी मेरी मदद कर सकता हैं?
यहाँ काम कोड का एक हिस्सा है getDOMNode
(कोड को सरल बनाने के लिए ia थोड़ा सा उपेक्षित स्थिति तर्क)
let SearchDropdown = React.createClass({
componentDidUpdate(params) {
let el = this.getDOMNode();
el.classList.remove('dropDown-top');
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
el.classList.add('dropDown-top');
}
},
render() {
let dataFeed = this.props.dataFeed;
return (
<DropDown >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
और यहाँ सेटस्टेट के साथ कोड है (जो एक अनंत लूप बनाता है)
let SearchDropdown = React.createClass({
getInitialState() {
return {
top: false
};
},
componentDidUpdate(params) {
let el = this.getDOMNode();
if (this.state.top) {
this.setState({top: false});
}
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
if (!this.state.top) {
this.setState({top: true});
}
}
},
render() {
let dataFeed = this.props.dataFeed;
let class = cx({'dropDown-top' : this.state.top});
return (
<DropDown className={class} >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
componentShouldUpdate
?
setState
जाएगा हमेशा एक फिर से प्रस्तुत करना ट्रिगर। कई बार चेक करनेstate.top
और कॉल करने के बजायsetState
, केवल उसी चीज़ को ट्रैक करें जिसे आपstate.top
स्थानीय वैरिएबल में रखना चाहते हैं , फिरcomponentDidUpdate
कॉल के अंत मेंsetState
केवल एक बार अगर आपका स्थानीय वैरिएबल मेल नहीं खाता हैstate.top
। जैसा कि यह अभी खड़ा है, आपstate.top
पहले री-रेंडर के तुरंत बाद रीसेट कर देते हैं, जो आपको अनंत लूप में डाल देता है।