Açılır menünün yüksekliğine ve girişin ekrandaki konumuna bağlı olarak açılır menüyü girişin altına veya üstüne taşıyan bir komut dosyası yazıyorum. Ayrıca değiştiriciyi yönüne göre açılır menüye ayarlamak istiyorum. Ama kullanaraksetState içinicomponentDidUpdate sonsuz bir döngü yaratır (ki bu açıktır)
Kullanarak bir çözüm buldum getDOMNodeDoğrudan açılır listeye sınıf adını ve ayarlama konusunda , ancak React araçlarını kullanarak daha iyi bir çözüm olması gerektiğini düşünüyorum. Birisi bana yardım edebilir mi?
İşte kodun getDOMNode(kodu basitleştirmek için biraz ihmal edilmiş bir konumlandırma mantığı) ile çalışma kodunun bir parçası.
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>
);
}
});
ve işte setstate ile kod (sonsuz bir döngü oluşturan)
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>
);
}
});
componentDidUpdatede bu keman .
componentShouldUpdate?
setState, her zaman bir yeniden oluşturmayı tetikleyecek. Birden çok kez kontrol etmekstate.topve aramak yerine , yerel bir değişkendesetStatene olmasını istediğinizistate.top, ardından yalnızca yerel değişkeniniz eşleşmiyorsacomponentDidUpdatearama sonunda bir kezsetStateizleyinstate.top. Şu anda olduğu gibistate.top, ilk yeniden oluşturmadan hemen sonra sıfırlarsınız , bu da sizi sonsuz döngüye sokar.