Katakanlah saya memiliki komponen tampilan yang memiliki render bersyarat:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
MyInput terlihat seperti ini:
class MyInput extends React.Component {
...
render(){
return (
<div>
<input name={this.props.name}
ref="input"
type="text"
value={this.props.value || null}
onBlur={this.handleBlur.bind(this)}
onChange={this.handleTyping.bind(this)} />
</div>
);
}
}
Katakanlah employed
itu benar. Setiap kali saya mengalihkannya ke false dan tampilan lain merender, hanya unemployment-duration
diinisialisasi ulang. Juga unemployment-reason
akan diisi sebelumnya dengan nilai dari job-title
(jika nilai diberikan sebelum kondisi berubah).
Jika saya mengubah markup dalam rutinitas rendering kedua menjadi seperti ini:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<span>Diff me!</span>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
Sepertinya semuanya bekerja dengan baik. Sepertinya React gagal membedakan 'job-title' dan 'pengangguran-reason'.
Tolong beritahu saya apa yang saya lakukan salah ...
javascript
reactjs
o01
sumber
sumber
data-reactid
di setiap elemenMyInput
(atauinput
, seperti yang terlihat di DOM) sebelum dan sesudahemployed
pengalihan?<div>
. Thedata-reactid
atribut tampaknya berbeda pada kedua div pembungkus dan field input.job-title
masukan mendapat iddata-reactid=".0.1.1.0.1.0.1"
, sedangkanunemployment-reason
masukan mendapat iddata-reactid=".0.1.1.0.1.2.1"
unemployment-duration
?reactid
atributnya identikjob-title
danunemployment-reason
, sedangkan pada contoh kedua (dengan span diff) atributnya berbeda.unemployment-duration
parareactid
atribut selalu unik.Jawaban:
Apa yang mungkin terjadi adalah React berpikir bahwa hanya satu
MyInput
(unemployment-duration
) yang ditambahkan di antara render. Dengan demikian,job-title
tidak pernah diganti denganunemployment-reason
, yang juga mengapa nilai yang telah ditentukan sebelumnya ditukar.Ketika React melakukan diff, itu akan menentukan komponen mana yang baru dan mana yang lama berdasarkan
key
propertinya. Jika tidak ada kunci seperti itu yang diberikan dalam kode, itu akan membuatnya sendiri.Alasan mengapa potongan kode terakhir yang Anda berikan berfungsi adalah karena React pada dasarnya perlu mengubah hierarki semua elemen di bawah induk
div
dan saya yakin itu akan memicu render ulang semua anak (itulah mengapa ini berfungsi). Jika Anda menambahkan bagianspan
bawah dan bukan bagian atas, hierarki elemen sebelumnya tidak akan berubah, dan elemen tersebut tidak akan dirender ulang (dan masalah akan tetap ada).Inilah yang dikatakan dokumentasi resmi React :
Anda harus dapat memperbaikinya dengan menyediakan
key
sendiri elemen unik untuk indukdiv
atau semuaMyInput
elemen.Sebagai contoh:
ATAU
Sekarang, ketika React melakukan diff, itu akan melihat bahwa
divs
berbeda dan akan merender ulang termasuk semua anaknya (contoh pertama). Dalam contoh ke-2, diff akan berhasiljob-title
danunemployment-reason
karena mereka sekarang memiliki kunci yang berbeda.Anda tentu saja dapat menggunakan kunci apa pun yang Anda inginkan, asalkan unik.
Perbarui Agustus 2017
Untuk pemahaman yang lebih baik tentang bagaimana kunci bekerja di React, saya sangat menyarankan membaca jawaban saya untuk Memahami kunci unik di React.js .
Perbarui November 2017
Pembaruan ini seharusnya telah diposting beberapa waktu yang lalu, tetapi menggunakan string literal
ref
sekarang sudah tidak digunakan lagi. Misalnyaref="job-title"
sekarang sebagai gantinyaref={(el) => this.jobTitleRef = el}
(misalnya). Lihat jawaban saya untuk peringatan Deprecation using this.refs untuk info lebih lanjut.sumber
it will determine which components are new and which are old based on their key property.
- itu adalah ... kunci ... pemahaman sayaUbah kunci komponen.
Komponen akan dilepas dan contoh baru Komponen akan dipasang karena kunci telah berubah.
sunting : Didokumentasikan pada Anda Mungkin Tidak Perlu Status Berasal :
sumber
Gunakan
setState
dalam pandangan Anda untuk mengubahemployed
properti negara. Ini adalah contoh mesin render React.sumber
Saya sedang mengerjakan Crud untuk aplikasi saya. Ini adalah bagaimana saya melakukannya Got Reactstrap sebagai ketergantungan saya.
Beberapa React Hooks di sana
sumber