Saya memiliki elemen formulir dengan label
s dan saya ingin memiliki ID unik untuk ditautkan label
ke elemen dengan htmlFor
atribut. Sesuatu seperti ini:
React.createClass({
render() {
const id = ???;
return (
<label htmlFor={id}>My label</label>
<input id={id} type="text"/>
);
}
});
Saya biasa membuat ID berdasarkan this._rootNodeID
tetapi tidak tersedia sejak React 0.13. Apa cara terbaik dan / atau termudah untuk melakukannya sekarang?
id = 'unique' + (++GLOBAL_ID);
dimanavar GLOBAL_ID=0;
?<label>My label<input type="text"/></label>
Jawaban:
Solusi ini berfungsi dengan baik untuk saya.
utils/newid.js
:Dan saya bisa menggunakannya seperti ini:
Tetapi itu tidak akan berfungsi di aplikasi isomorfik.
Ditambahkan 17.08.2015 . Selain fungsi custom newId, Anda bisa menggunakan uniqueId dari lodash.
Diperbarui 28.01.2016 . Lebih baik membuat ID dalam
componentWillMount
.sumber
render
! Buat id dicomponentWillMount
render
. facebook.github.io/react/docs/component-specs.html . Ini seharusnya cukup mudah untuk diperbaiki.componentWillMount
tidak digunakan lagi, lakukan ini di konstruktor. Lihat: reactjs.org/docs/react-component.html#unsafe_componentwillmountId harus ditempatkan di dalam
componentWillMount(update untuk 2018)constructor
, bukanrender
. Memasukkannyarender
akan menghasilkan kembali id baru yang tidak perlu.Jika Anda menggunakan garis bawah atau lodash, ada
uniqueId
fungsi, jadi kode yang Anda hasilkan harus seperti:Pembaruan 2019 Hooks:
sumber
const {current: id} = useRef(_uniqueId('prefix-'))
Menindaklanjuti 2019-04-04, ini tampaknya dapat dicapai dengan React Hooks '
useState
:Seperti yang saya pahami, Anda mengabaikan item larik kedua dalam pengrusakan larik yang memungkinkan Anda memperbarui
id
, dan sekarang Anda memiliki nilai yang tidak akan diperbarui lagi selama masa pakai komponen.Nilai dari
id
akan menjadi dimyprefix-<n>
mana<n>
nilai integer tambahan yang dikembalikanuniqueId
. Jika itu tidak cukup unik untuk Anda, pertimbangkan untuk membuat suka sendiriatau lihat perpustakaan yang saya terbitkan dengan ini di sini: https://github.com/rpearce/simple-uniqueid . Ada juga ratusan atau ribuan ID unik lainnya di luar sana, tetapi lodash
uniqueId
dengan awalan sudah cukup untuk menyelesaikan pekerjaan.Perbarui 2019-07-10
Terima kasih kepada @Huong Hk karena telah mengarahkan saya ke status awal malas hooks , yang jumlahnya adalah Anda dapat meneruskan fungsi
useState
yang hanya akan dijalankan pada pemasangan awal.sumber
<input />
, yang penting adalah bahwa atributhtmlFor
danid
harus diikat bersama apa pun nilainya.initialState
# 1const [ id ] = useState(() => uniqueId('myprefix-'))
daripada hasil fungsi # 2const [ id ] = useState(uniqueId('myprefix-'))
Status:id
dari 2 cara di atas tidak berbeda. Tapi perbedaannyauniqueId('myprefix-')
akan dieksekusi sekali (# 1) daripada setiap dirender ulang (# 2). Lihat: Kondisi awal malas: reactjs.org/docs/hooks-reference.html#lazy-initial-state Cara membuat objek mahal dengan malas ?: reactjs.org/docs/…Anda bisa menggunakan pustaka seperti node-uuid untuk ini untuk memastikan Anda mendapatkan id unik.
Instal menggunakan:
npm install node-uuid --save
Kemudian di komponen react Anda, tambahkan yang berikut ini:
sumber
render
melanggar facebook.github.io/react/docs/component-specs.htmlSemoga ini bermanfaat bagi siapa saja yang datang mencari solusi universal / isomorfik, karena masalah checksum yang membawa saya ke sini.
Seperti yang dikatakan di atas, saya telah membuat utilitas sederhana untuk membuat id baru secara berurutan. Karena ID terus bertambah di server, dan mulai dari 0 di klien, saya memutuskan untuk mengatur ulang kenaikan setiap SSR dimulai.
Dan kemudian di konstruktor komponen root atau componentWillMount, panggil reset. Ini pada dasarnya menyetel ulang cakupan JS untuk server di setiap render server. Di klien itu tidak (dan seharusnya) tidak berpengaruh.
sumber
Untuk penggunaan biasa dari
label
daninput
, akan lebih mudah untuk memasukkan input ke dalam label seperti ini:Ini juga memungkinkan di kotak centang / radiobuttons untuk menerapkan padding ke elemen root dan masih mendapatkan umpan balik dari klik pada masukan.
sumber
select
, banyak label pada posisi yang berbeda, komponen ui yang tidak digabungkan, dll., Juga menggunakan id disarankan a11y: Umumnya, label eksplisit lebih baik didukung oleh teknologi pendukung, w3. org / WAI / tutorials / forms / labels /…Saya menemukan solusi mudah seperti ini:
sumber
Cara sederhana lainnya dengan ketikan:
sumber
Saya membuat modul generator uniqueId (Typecript):
Dan gunakan modul atas untuk menghasilkan id unik:
sumber
Jangan gunakan ID sama sekali jika Anda tidak perlu, alih-alih bungkus input dalam label seperti ini:
Maka Anda tidak perlu khawatir tentang ID unik.
sumber