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 setState
bagian dalam componentDidUpdate
menciptakan loop tak terbatas (yang jelas)
Saya telah menemukan solusi dalam menggunakan getDOMNode
dan 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>
);
}
});
componentDidUpdate
dalam biola ini .
componentShouldUpdate
?
setState
akan selalu memicu re-render. Daripada memeriksastate.top
dan meneleponsetState
beberapa kali, cukup lacak apa yang Anda inginkanstate.top
dalam variabel lokal, lalu sekali pada akhircomponentDidUpdate
panggilansetState
hanya jika variabel lokal Anda tidak cocokstate.top
. Seperti berdiri sekarang, Anda segera me-resetstate.top
setelah re-render pertama, yang menempatkan Anda di loop tak terbatas.