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 getDOMNode
Doğ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>
);
}
});
componentDidUpdate
de bu keman .
componentShouldUpdate
?
setState
, her zaman bir yeniden oluşturmayı tetikleyecek. Birden çok kez kontrol etmekstate.top
ve aramak yerine , yerel bir değişkendesetState
ne olmasını istediğinizistate.top
, ardından yalnızca yerel değişkeniniz eşleşmiyorsacomponentDidUpdate
arama sonunda bir kezsetState
izleyinstate.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.