Apa reaksi reaksi pengaturan fokus pada bidang teks tertentu setelah komponen diberikan?
Dokumentasi tampaknya menyarankan penggunaan referensi, misalnya:
Setel ref="nameInput"
pada kolom input saya di fungsi render, lalu panggil:
this.refs.nameInput.getInputDOMNode().focus();
Tapi di mana saya harus memanggil ini? Saya sudah mencoba beberapa tempat tetapi saya tidak bisa membuatnya bekerja.
javascript
reactjs
Dave
sumber
sumber
<input>
elemen. Sesuatu seperti<input ref={ (component) => ReactDOM.findDOMNode(component).focus() } />
@Dhiraj's jawaban sudah benar, dan untuk kenyamanan Anda dapat menggunakan prop autoFocus untuk memiliki input secara otomatis fokus ketika dipasang:
Perhatikan bahwa dalam jsx itu
autoFocus
( huruf kapital F) tidak seperti html biasa yang tidak peka huruf besar-kecil.sumber
autofocus
atribut tidak dapat diandalkan HTML5 , itu benar-benar digunakanfocus()
pada DOM mountreact-dom
sehingga cukup dapat diandalkan.Pada Bereaksi 0,15 , metode yang paling ringkas adalah:
sumber
Fokus pada mount
Jika Anda hanya ingin memfokuskan suatu elemen saat ia melakukan mount (awalnya membuat), penggunaan sederhana atribut autoFocus akan dilakukan.
Fokus dinamis
untuk mengontrol fokus secara dinamis, gunakan fungsi umum untuk menyembunyikan detail implementasi dari komponen Anda.
Bereaksi 16.8 + Komponen fungsional - useFocus hook
Demo Penuh
Bereaksi 16.3 + Komponen Kelas - utilFocus
Demo Penuh
sumber
(htmlElRef.current as any).focus()
dan (2)return {htmlElRef, setFocus}
bukan array.useFocus
lebih dari satu elemen.useFocus
ditulis dalam naskah. gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573as const
Anda miliki), sangat mendidik!set
di posisi kedua seperticonst [inputRef, setInputFocus] = useFocus()
. Ini cocok menggunakanState lebih. Pertama objek, lalu setter objek ituJika Anda hanya ingin membuat fokus otomatis di Bereaksi, itu sederhana.
Sementara jika Anda hanya ingin tahu di mana harus meletakkan kode itu, jawabannya ada di componentDidMount ().
v014.3
Baca dokumen API di sini: https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
sumber
F
! (Catatan untuk diri sendiri dan orang lain, bukan untuk penjawab).Bereaksi 16.3 menambahkan cara mudah baru untuk menangani ini dengan membuat referensi dalam konstruktor komponen dan menggunakannya seperti di bawah ini:
Untuk lebih jelasnya, Anda dapat memeriksa artikel ini di React blog.
Memperbarui:
Mulai dari React 16.8 ,
useRef
kait dapat digunakan dalam komponen fungsi untuk mencapai hasil yang sama:sumber
Saya baru saja mengalami masalah ini dan saya menggunakan react
15.0.115.0.2 dan saya menggunakan sintaks ES6 dan tidak mendapatkan apa yang saya butuhkan dari jawaban lain sejak v.15 turun beberapa minggu yang lalu dan beberapathis.refs
properti sudah ditinggalkan dan dihapus .Secara umum, yang saya butuhkan adalah:
Saya menggunakan:
Fokuskan Elemen Input Pertama
Saya menggunakan
autoFocus={true}
yang pertama<input />
di halaman sehingga ketika komponen mount, itu akan mendapatkan fokus.Fokuskan Elemen Input Pertama dengan Kesalahan
Ini memakan waktu lebih lama dan lebih berbelit-belit. Saya menyimpan kode yang tidak relevan dengan solusi untuk singkatnya.
Redux Store / Negara
Saya perlu negara global untuk mengetahui apakah saya harus mengatur fokus dan menonaktifkannya ketika sudah diatur, jadi saya tidak terus mengatur ulang fokus saat komponen dirender ulang (saya akan menggunakan
componentDidUpdate()
untuk memeriksa pengaturan fokus. )Ini dapat dirancang sesuai keinginan Anda untuk aplikasi Anda.
Komponen Wadah
Komponen harus memiliki
resetfocus
set properti dan callBack untuk menghapus properti jika akhirnya menetapkan fokus pada dirinya sendiri.Juga perhatikan, saya mengatur Pencipta Tindakan saya ke dalam file terpisah sebagian besar karena proyek saya cukup besar dan saya ingin memecahnya menjadi potongan-potongan yang lebih mudah dikelola.
Komponen Presentasi
Gambaran
Gagasan umum adalah bahwa setiap bidang formulir yang bisa memiliki kesalahan dan menjadi fokus perlu memeriksa sendiri dan jika perlu mengatur fokus pada dirinya sendiri.
Ada logika bisnis yang perlu terjadi untuk menentukan apakah bidang yang diberikan adalah bidang yang tepat untuk menetapkan fokus. Ini tidak ditampilkan karena akan tergantung pada aplikasi individual.
Saat formulir dikirimkan, acara itu perlu mengatur bendera fokus global
resetFocus
menjadi true. Kemudian ketika masing-masing komponen memperbarui sendiri, itu akan melihat bahwa itu harus memeriksa untuk melihat apakah itu mendapatkan fokus dan jika ya, mengirimkan acara untuk mengatur ulang fokus sehingga elemen lain tidak harus terus memeriksa.sunting Sebagai catatan tambahan, saya memiliki logika bisnis saya dalam file "utilitas" dan saya baru saja mengekspor metode dan menyebutnya dalam setiap
shouldfocus()
metode.Bersulang!
sumber
Dokumen Bereaksi sekarang memiliki bagian untuk ini. https://facebook.github.io/react/docs/more-about-refs.html#the-ref-callback-attribute
sumber
autofocus
di mount, hanya mencari elemen untuk tetap fokus ketika memasukkan nilai. Ini bekerja dengan sempurna untuk skenario itu. (menggunakan reaksi 15)Ini bukan lagi jawaban terbaik. Pada v0.13,
this.refs
mungkin tidak tersedia sampai SETELAHcomponentDidMount()
berjalan, dalam beberapa kasus aneh.Cukup tambahkan
autoFocus
tag ke bidang input Anda, seperti yang ditampilkan FakeRainBrigand di atas.sumber
<input autofocus>
bidang tidak akan berperilaku baik<input>
render setelahRef. @ Dave mengomentari jawaban @ Dhiraj; alternatifnya adalah dengan menggunakan fungsi callback dari atribut ref pada elemen yang diberikan (setelah komponen merender terlebih dahulu):
Info lebih lanjut
sumber
Uncaught TypeError: Cannot read property 'focus' of null
component && React.findDomNode...
. Baca lebih lanjut di sini: facebook.github.io/react/docs/…Ini cara yang tepat, cara autofocus. Ketika Anda menggunakan callback alih-alih string sebagai nilai ref, itu secara otomatis dipanggil. Anda mendapatkan referensi Anda tersedia daripada tanpa perlu menyentuh DOM menggunakan
getDOMNode
sumber
Perhatikan bahwa tidak ada jawaban ini yang berfungsi untuk saya dengan komponen TextField material-ui . Per Bagaimana mengatur fokus ke TextUIField materialUI? Saya harus melompati beberapa rintangan agar ini berhasil:
sumber
focus()
ke harus ditunda hingga akhir animasi.Anda dapat menempatkan pemanggilan metode di dalam fungsi render. Atau di dalam metode siklus hidup,
componentDidUpdate
sumber
Kamu tidak perlu
getInputDOMNode
?? pada kasus ini...Cukup dengan
ref
danfocus()
ketika komponen di-mount - componentDidMount ...sumber
AutoFocus bekerja paling baik untuk saya. Saya perlu mengubah beberapa teks menjadi input dengan teks itu pada klik ganda jadi inilah yang saya akhirnya dapatkan:
CATATAN: Untuk memperbaiki masalah di mana Bereaksi menempatkan tanda sisipan di awal teks gunakan metode ini:
Ditemukan di sini: https://coderwall.com/p/0iz_zq/how-to-put-focus-at-the-end-of-an-input-with-react-js
sumber
Saya memiliki masalah yang sama tetapi saya memiliki beberapa animasi juga, jadi kolega saya menyarankan untuk menggunakan window.requestAnimationFrame
ini adalah atribut ref dari elemen saya:
sumber
Seharusnya
sumber
Jawaban paling sederhana adalah menambahkan ref = "some name" di elemen teks input dan memanggil fungsi di bawah ini.
sumber
Untuk memindahkan fokus ke elemen yang baru dibuat, Anda dapat menyimpan ID elemen dalam keadaan dan menggunakannya untuk mengatur
autoFocus
. misalnyaDengan cara ini, tidak ada kotak teks yang fokus pada pemuatan halaman (seperti yang saya inginkan), tetapi ketika Anda menekan tombol "Tambah" untuk membuat catatan baru, maka catatan baru itu akan fokus.
Karena
autoFocus
tidak "berjalan" lagi kecuali komponennya di-remount, saya tidak perlu repot-repot untuk tidak menyetelthis.state.focus
(yaitu tidak akan mencuri kembali fokus ketika saya memperbarui status lainnya).sumber
Baca hampir semua jawabannya tetapi tidak melihat
getRenderedComponent().props.input
Atur referensi input teks Anda
this.refs.username.getRenderedComponent().props.input.onChange('');
sumber
Setelah mencoba banyak opsi di atas tanpa hasil, saya menemukan bahwa itu seperti saya
disabling
dan kemudianenabling
input yang menyebabkan fokus menjadi hilang.Saya punya prop
sendingAnswer
yang akan menonaktifkan Input saat saya sedang polling backend.Setelah saya menghapus prop yang dinonaktifkan semuanya mulai bekerja lagi.
sumber
Versi yang diperbarui dapat Anda periksa di sini
sumber
Karena ada banyak alasan untuk kesalahan ini, saya berpikir bahwa saya juga akan memposting masalah yang saya hadapi. Bagi saya, masalahnya adalah saya memberikan input sebagai konten dari komponen lain.
Ini adalah cara saya menyebut komponen di atas:
sumber
Menurut sintaks yang diperbarui, Anda dapat menggunakan
this.myRref.current.focus()
sumber