Saya sedang menulis skrip yang memindahkan input dropdown di bawah atau di atas tergantung pada ketinggian dropdown dan posisi input di layar. Saya juga ingin mengatur pengubah ke dropdown sesuai dengan arahnya. Tetapi menggunakan setStatebagian dalam componentDidUpdatemenciptakan loop tak terbatas (yang jelas)
Saya telah menemukan solusi dalam menggunakan getDOMNodedan mengatur classname untuk dropdown secara langsung, tetapi saya merasa bahwa harus ada solusi yang lebih baik menggunakan alat Bereaksi. Adakah yang bisa membantu saya?
Ini adalah bagian dari kode kerja dengan getDOMNode(ia sedikit mengabaikan logika penentuan posisi untuk menyederhanakan kode)
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>
);
}
});
dan di sini adalah kode dengan setstate (yang menciptakan loop tak terbatas)
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>
);
}
});
componentDidUpdatedalam biola ini .
componentShouldUpdate?
setStateakan selalu memicu re-render. Daripada memeriksastate.topdan meneleponsetStatebeberapa kali, cukup lacak apa yang Anda inginkanstate.topdalam variabel lokal, lalu sekali pada akhircomponentDidUpdatepanggilansetStatehanya jika variabel lokal Anda tidak cocokstate.top. Seperti berdiri sekarang, Anda segera me-resetstate.topsetelah re-render pertama, yang menempatkan Anda di loop tak terbatas.