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>
);
}
});
javascript
reactjs
ecmascript-6
Katerina Pavlenko
sumber
sumber
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.componentDidUpdate
dalam biola ini .componentShouldUpdate
?Jawaban:
Anda bisa menggunakannya
setState
di dalamcomponentDidUpdate
. Masalahnya adalah entah bagaimana Anda membuat loop tak terbatas karena tidak ada kondisi istirahat.Berdasarkan fakta bahwa Anda memerlukan nilai yang disediakan oleh browser setelah komponen diberikan, saya pikir pendekatan Anda tentang penggunaan
componentDidUpdate
sudah benar, hanya perlu penanganan yang lebih baik dari kondisi yang memicusetState
.sumber
componentDidUpdate
dan hanya dapat ditambahkan sesuai kebutuhanrender
saja.Tanda
componentDidUpdate
tanganvoid::componentDidUpdate(previousProps, previousState)
. Dengan ini Anda akan dapat menguji alat peraga / negara bagian mana yang kotor dan memanggil yangsetState
sesuai.Contoh:
sumber
componentDidMount
tidak memiliki argumen, dan hanya dipanggil saat komponen dibuat, jadi tidak dapat digunakan untuk tujuan yang dijelaskan.componentDidMount
, jadi ketika saya menulis jawabannya, nama terkenal itu mengalir š® Sekali lagi, Terima kasih & Hebat!componentDidUpdate(prevProps, prevState) { if ( prevState.x!== this.state.x) { //Do Something } }
Jika Anda menggunakan
setState
dalamcomponentDidUpdate
itu update komponen, sehingga panggilan untukcomponentDidUpdate
yang kemudian panggilansetState
lagi mengakibatkan loop tak terbatas. Anda harus menelepon secara kondisionalsetState
dan memastikan bahwa kondisi yang melanggar panggilan terjadi pada akhirnya, misalnya:Jika Anda hanya memperbarui komponen dengan mengirimkan alat peraga untuk itu (itu tidak diperbarui oleh setState, kecuali untuk case di dalam componentDidUpdate), Anda dapat memanggil
setState
bagian dalamcomponentWillReceiveProps
alih-alihcomponentDidUpdate
.sumber
getDerivedStateFromProps
.Contoh ini akan membantu Anda memahami React Life Cycle Hooks .
Anda bisa
setState
dalamgetDerivedStateFromProps
metode yaitustatic
dan memicu metode setelah alat peraga berubahcomponentDidUpdate
.Di dalam
componentDidUpdate
Anda akan mendapatkan param 3 yang kembali darigetSnapshotBeforeUpdate
.Anda dapat memeriksa kode dan tautan kotak ini
sumber
Saya akan mengatakan bahwa Anda perlu memeriksa apakah negara sudah memiliki nilai yang sama yang Anda coba tetapkan. Jika sama, tidak ada titik untuk mengatur negara lagi untuk nilai yang sama.
Pastikan untuk mengatur negara Anda seperti ini:
sumber
Saya memiliki masalah serupa di mana saya harus memusatkan toolTip. Bereaksi setState di componentDidUpdate tidak menempatkan saya di infinite loop, saya mencoba kondisi itu berfungsi. Tetapi saya menemukan menggunakan ref callback memberi saya solusi yang lebih sederhana dan bersih, jika Anda menggunakan fungsi inline untuk ref callback Anda akan menghadapi masalah nol untuk setiap pembaruan komponen. Jadi gunakan referensi fungsi dalam ref callback dan atur status di sana, yang akan memulai render ulang
sumber