Saya mendefinisikan dua bidang TextInput sebagai berikut:
<TextInput
style = {styles.titleInput}
returnKeyType = {"next"}
autoFocus = {true}
placeholder = "Title" />
<TextInput
style = {styles.descriptionInput}
multiline = {true}
maxLength = {200}
placeholder = "Description" />
Tetapi setelah menekan tombol "berikutnya" pada keyboard saya, aplikasi asli-reaksi saya tidak melompat ke bidang TextInput kedua. Bagaimana saya bisa mencapainya?
Terima kasih!
ios
react-native
andreaswiena
sumber
sumber
v16.8.0
atau di atas, saya akan merekomendasikan jawaban yang diberikan oleh @Eli Johnson di bagian bawah. Bereaksi telah meninggalkan banyak kegunaan dariref
solusi yang disediakan di bawah ini.Jawaban:
Set kedua
TextInput
fokus, ketika sebelumnyaTextInput
'sonSubmitEditing
dipicu.Coba ini
Menambahkan Ref ke TextInput kedua
ref={(input) => { this.secondTextInput = input; }}
Bind fungsi fokus untuk acara onSubmitEditing TextInput pertama .
onSubmitEditing={() => { this.secondTextInput.focus(); }}
Ingatlah untuk mengatur blurOnSubmit ke false, untuk mencegah papan ketik berkedip-kedip.
blurOnSubmit={false}
sumber
onSubmitEditing
panggilan balik itu dipanggil setelahblur
acara. Jadi keyboard mungkin menjadi gila jika segera fokus pada elemen berikutnya. Jadi mungkin membantu untuk mengaturblurOnSubmit={false}
ke semua elemen dalam bentuk tetapi biarkantrue
pada elemen terakhir, untuk memungkinkan tombol Selesai mengaburkan input terakhir.blurOnSubmit={false}
untuk mencegah kerlip keyboard menyebabkan ini berhenti bekerja, ada yang tahu apa yang terjadi?focus
pekerjaan, pastikan Anda tidak menggunakan pembungkus untukTextInput
komponen. Jika Anda memilikiCustomTextInput
komponen yang membungkusTextInput
, Anda perlu menerapkanTextInput
metode blur dan fokus untuk komponen itu sehingga akan berfungsi seperti yang diharapkan.Anda dapat melakukan ini tanpa menggunakan referensi . Pendekatan ini lebih disukai, karena referensi dapat menyebabkan kode rapuh . The Bereaksi docs menyarankan menemukan solusi lain jika mungkin:
Sebagai gantinya, kami akan menggunakan variabel status untuk memfokuskan bidang input kedua.
Tambahkan variabel status yang akan kami sampaikan sebagai penyangga ke
DescriptionInput
:Tetapkan metode handler yang akan mengatur variabel status ini menjadi true:
Setelah memasukkan / menekan enter / selanjutnya pada
TitleInput
, kami akan meneleponhandleTitleInputSubmit
. Ini akanfocusDescriptionInput
menjadi true.DescriptionInput
'sfocus
prop diatur untuk kamifocusDescriptionInput
variabel negara. Jadi, ketikafocusDescriptionInput
perubahan (dalam langkah 3),DescriptionInput
akan dirender ulangfocus={true}
.Ini adalah cara yang bagus untuk menghindari penggunaan referensi, karena referensi dapat menyebabkan kode yang lebih rapuh :)
EDIT: h / t ke @LaneRettig untuk menunjukkan bahwa Anda harus membungkus React Native TextInput dengan beberapa alat peraga tambahan & metode untuk membuatnya merespons
focus
:sumber
Pada Bereaksi Asli 0,36, panggilan
focus()
(seperti yang disarankan dalam beberapa jawaban lain) pada simpul input teks tidak didukung lagi. Sebagai gantinya, Anda dapat menggunakanTextInputState
modul dari React Native. Saya membuat modul pembantu berikut untuk mempermudah ini:Anda dapat, kemudian, memanggil
focusTextInput
fungsi pada "ref" aTextInput
. Sebagai contoh:sumber
<Field ... onSubmitEditing={() => focusTextInput(this._password)} />
dan ref harus seperti ini<Field ... withRef refName={e => this._password = e}/>
calling focus() on a text input node isn't supported any more
=> klaim berani, sumber? Memanggilfocus()
berfungsi dengan baik dengan v0.49.5 +TextInputState
tidak didokumentasikan sementarafocus()
danblur()
disebutkan: facebook.github.io/react-native/releases/next/docs/…Saya membuat perpustakaan kecil yang melakukan ini, tidak diperlukan perubahan kode selain mengganti tampilan pembungkus Anda dan mengimpor TextInput:
https://github.com/zackify/react-native-autofocus
Dijelaskan secara terperinci di sini: https://zach.codes/autofocus-inputs-in-react-native/
sumber
Saya pikir saya akan membagikan solusi saya menggunakan komponen fungsi ... ' ini ' tidak diperlukan!
Berikut adalah contoh komponen saya:
Saya tidak tahu, harap ini membantu seseorang =)
sumber
Menggunakan react-asli 0.45.1 Saya juga mengalami masalah mencoba mengatur fokus pada kata sandi TextInput setelah menekan tombol kembali pada nama pengguna TextInput.
Setelah mencoba sebagian besar solusi berperingkat teratas di SO, saya menemukan solusi pada github yang memenuhi kebutuhan saya: https://github.com/shoutem/ui/issues/44#issuecomment-290724642
Singkatnya:
Dan kemudian saya menggunakannya seperti ini:
sumber
ref
menjadiinputRef
... Anda dapat menjatuhkan seluruh komponen khusus Anda dan blok kode kedua Anda akan berfungsi apa adanya selama Anda kembali menggunakanref
Bagi saya di RN 0,50.3 itu mungkin dengan cara ini:
Anda harus melihat ini.PasswordInputRef. _root .fokus ()
sumber
Jika Anda menggunakan
tcomb-form-native
seperti saya, Anda dapat melakukan ini juga. BeginiTextInput
caranya : alih-alih mengatur alat peraga secara langsung, Anda melakukannya melaluioptions
. Anda bisa merujuk ke bidang formulir sebagai:Jadi produk akhir terlihat seperti ini:
(Kredit untuk remcoanker untuk memposting ide di sini: https://github.com/gcanti/tcomb-form-native/issues/96 )
sumber
Inilah cara saya mencapainya. Dan contoh di bawah ini telah menggunakan API React.createRef () yang diperkenalkan di Bereaksi 16.3.
Saya pikir ini akan membantu Anda.
sumber
Skenario saya adalah <CustomBoladonesTextInput /> membungkus RN <TextInput /> .
Saya memecahkan masalah ini sebagai berikut:
Bentuk saya seperti:
Pada definisi komponen CustomBoladonesTextInput, saya meneruskan refField ke prop ref dalam seperti ini:
Dan voila. Semuanya kembali berfungsi lagi. Semoga ini membantu
sumber
Coba solusi ini pada masalah React Native's GitHub.
https://github.com/facebook/react-native/pull/2149#issuecomment-129262565
Anda perlu menggunakan penyangga ref untuk komponen TextInput.
Maka Anda perlu membuat fungsi yang dipanggil pada prop onSubmitEditing yang memindahkan fokus pada ref TextInput kedua.
sumber
Menggunakan referensi panggil balik alih-alih referensi string lama :
sumber
Dan tambahkan metode untuk
onSubmitEditing={() => this.focusTextInput(this.refs.password)}
seperti di bawah ini:sumber
Agar solusi yang diterima berfungsi jika Anda
TextInput
berada di dalam komponen lain, Anda harus "memunculkan" referensi dariref
ke wadah induk.sumber
dalam komponen Anda:
Catatan: Saya menggunakan
._root
karena ini adalah referensi ke TextInput di NativeBase'Library 'Inputdan dalam input teks Anda seperti ini
sumber
dan tambahkan metode
sumber
Ada cara untuk menangkap tab di a
TextInput
. Rampok, tapi lebih baik daripada tidak sama sekali .Tetapkan
onChangeText
handler yang membandingkan nilai input baru dengan yang lama, memeriksa a\t
. Jika ditemukan, lanjutkan bidang seperti yang ditunjukkan oleh @boredgamesDengan asumsi variabel
username
berisi nilai untuk nama pengguna dansetUsername
mengirimkan tindakan untuk mengubahnya di toko (status komponen, toko redux, dll), lakukan sesuatu seperti ini:sumber
Di sini solusi reagen untuk komponen input yang memiliki: properti fokus.
Bidang akan difokuskan selama prop ini disetel ke true dan tidak akan memiliki fokus selama ini salah.
Sayangnya komponen ini perlu memiliki: ref didefinisikan, saya tidak dapat menemukan cara lain untuk memanggil .focus () di atasnya. Saya senang dengan saran.
https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5
sumber
swap!
suatuatom
jenis. Sesuai dokumen, ini digunakan untuk mengikat React: "Setiap komponen yang menggunakan atom secara otomatis dirender ketika nilainya berubah." reagent-project.github.ioJika Anda menggunakan NativeBase sebagai Komponen UI, Anda dapat menggunakan sampel ini
sumber