Saya hanya menulis ke input teks dan onChange
jika saya menelepon setState
, maka React me-render UI saya. Masalahnya adalah input teks selalu kehilangan fokus, jadi saya perlu memfokuskannya lagi untuk setiap huruf: D.
var EditorContainer = React.createClass({
componentDidMount: function () {
$(this.getDOMNode()).slimScroll({height: this.props.height, distance: '4px', size: '8px'});
},
componentDidUpdate: function () {
console.log("zde");
$(this.getDOMNode()).slimScroll({destroy: true}).slimScroll({height: 'auto', distance: '4px', size: '8px'});
},
changeSelectedComponentName: function (e) {
//this.props.editor.selectedComponent.name = $(e.target).val();
this.props.editor.forceUpdate();
},
render: function () {
var style = {
height: this.props.height + 'px'
};
return (
<div className="container" style={style}>
<div className="row">
<div className="col-xs-6">
{this.props.selected ? <h3>{this.props.selected.name}</h3> : ''}
{this.props.selected ? <input type="text" value={this.props.selected.name} onChange={this.changeSelectedComponentName} /> : ''}
</div>
<div className="col-xs-6">
<ComponentTree editor={this.props.editor} components={this.props.components}/>
</div>
</div>
</div>
);
}
});
javascript
reactjs
Krab
sumber
sumber
Jawaban:
Tanpa melihat sisa kode Anda, ini adalah tebakan. Saat Anda membuat EditorContainer, tentukan kunci unik untuk komponen:
<EditorContainer key="editor1"/>
Saat rendering ulang terjadi, jika kunci yang sama terlihat, ini akan memberi tahu React jangan clobber dan meregenerasi tampilan, sebagai gantinya gunakan kembali. Kemudian item yang difokuskan harus mempertahankan fokus.
sumber
Saya terus datang kembali ke sini lagi dan lagi dan selalu menemukan solusi saya di tempat lain pada akhirnya. Jadi, saya akan mendokumentasikannya di sini karena saya tahu saya akan melupakan ini lagi!
Alasan
input
kehilangan fokus dalam kasus saya adalah karena fakta bahwa saya sedang merender ulanginput
perubahan status.Kode Buggy:
Jadi, masalahnya adalah saya selalu mulai mengkodekan semuanya di satu tempat untuk segera menguji dan kemudian memecah semuanya menjadi modul terpisah. Namun, di sini strategi ini menjadi bumerang karena memperbarui status pada perubahan input memicu fungsi render dan fokus hilang.
Perbaiki itu sederhana, lakukan modularisasi dari awal, dengan kata lain, "Pindahkan
Input
komponen darirender
fungsi"Kode Tetap
Ref. ke solusinya: https://github.com/styled-components/styled-components/issues/540#issuecomment-283664947
sumber
render()
danclass ... extends Component
karena referensi kethis
. misalnyaonChange={this.handleInputChange}
render
fungsi, untuk komponen fungsional React, jangan mendefinisikan komponen di badan fungsi.render
fungsi yang diteruskan metode 'this.handleChange' dan mengembalikan komponen yang akan digunakan. Misconst TextAreaDataField = TextAreaDataFieldFactory(this.handleChange)
. Saya hanya memindahkan pembuatan komponen ke konstruktor dan mengaksesnya dalamrender
metode sebagaithis.TextAreaDataField
. Bekerja seperti pesona.Jika itu masalah dalam router react,
<Route/>
gunakanrender
prop sebagai ganticomponent
.Hilangnya fokus terjadi karena penggunaan
component
propReact.createElement
setiap kali alih-alih hanya merender ulang perubahan.Detailnya di sini: https://reacttraining.com/react-router/web/api/Route/component
sumber
<Route component={() => <MyComponent/>} />
ketika saya seharusnya melakukannya<Route component={MyComponent} />
Jawaban saya mirip dengan apa yang dikatakan @ z5h.
Dalam kasus saya, saya biasa
Math.random()
menghasilkan uniquekey
untuk komponen.Saya pikir
key
ini hanya digunakan untuk memicu rerender untuk komponen tertentu daripada merender ulang semua komponen dalam array itu (saya mengembalikan array komponen dalam kode saya). Saya tidak tahu ini digunakan untuk memulihkan status setelah perenderan ulang.Menghapus itu melakukan pekerjaan untuk saya.
sumber
Menerapkan
autoFocus
atribut keinput
elemen dapat berfungsi sebagai solusi dalam situasi di mana hanya ada satu masukan yang perlu difokuskan. Dalam hal ini,key
atribut tidak diperlukan karena hanya satu elemen dan selanjutnya Anda tidak perlu khawatir tentang pemecahaninput
elemen menjadi komponennya sendiri untuk menghindari kehilangan fokus pada render ulang komponen utama.sumber
Saya mendapat perilaku yang sama.
Masalah dalam kode saya adalah saya membuat Array bersarang dari elemen jsx seperti ini:
Setiap elemen dalam Array bersarang ini dirender ulang setiap kali saya memperbarui elemen induk. Dan input hilang di sana prop "ref" setiap waktu
Saya memperbaiki Masalah dengan mengubah array dalam menjadi komponen reaksi (fungsi dengan fungsi render)
EDIT:
Masalah yang sama muncul saat saya membuat file bersarang
React.Fragment
sumber
Saya baru saja mengalami masalah ini dan datang ke sini untuk meminta bantuan. Periksa CSS Anda! Bidang input tidak dapat memiliki
user-select: none;
atau tidak akan berfungsi di iPad.sumber
Saya memecahkan masalah yang sama dengan menghapus atribut key di input dan elemen induknya
sumber
Bagi saya, ini disebabkan oleh kotak input pencarian yang dirender dalam komponen yang sama (disebut UserList) sebagai daftar hasil pencarian. Jadi, setiap kali hasil pencarian berubah, seluruh komponen UserList dirender, termasuk kotak input.
Solusi saya adalah membuat komponen baru yang disebut UserListSearch yang terpisah dari UserList . Saya tidak perlu menyetel kunci pada kolom input di UserListSearch agar ini berfungsi. Fungsi render UsersContainer saya sekarang terlihat seperti ini:
Semoga ini membantu seseorang juga.
sumber
Jika bidang masukan berada di dalam elemen lain (yaitu, elemen penampung seperti
<div key={"bart"}...><input key={"lisa"}...> ... </input></div>
- elipsis di sini menunjukkan kode yang dihilangkan), harus ada kunci unik dan konstan pada elemen penampung (serta di bidang masukan) . Selain itu, React merender elemen container baru saat status anak diperbarui, bukan hanya merender ulang container lama. Secara logis, hanya elemen anak yang harus diperbarui, tapi ...Saya mengalami masalah ini saat mencoba menulis komponen yang mengambil banyak informasi alamat. Kode kerja terlihat seperti ini
Pembaca mata tajam akan melihat bahwa itu
<fieldset>
adalah elemen yang mengandung, namun tidak memerlukan kunci. Hal yang sama berlaku untuk<>
dan<React.Fragment>
atau bahkan<div>
Mengapa? Mungkin hanya wadah segera yang membutuhkan kunci. Saya tidak tahu. Seperti yang dikatakan buku teks matematika, penjelasannya diserahkan kepada pembaca sebagai latihan.sumber
Alasan utamanya adalah: Saat React merender ulang, referensi DOM Anda sebelumnya tidak valid. Ini berarti react telah mengubah pohon DOM, dan Anda this.refs.input.focus tidak akan berfungsi, karena input di sini tidak ada lagi.
sumber
Jawaban yang diberikan tidak membantu saya, inilah yang saya lakukan tetapi saya memiliki situasi yang unik.
Untuk membersihkan kode saya cenderung menggunakan format ini sampai saya siap untuk menarik komponen ke file lain.
Tetapi ini menyebabkannya kehilangan fokus, ketika saya meletakkan kode langsung di div itu berhasil.
Saya tidak tahu mengapa ini terjadi, ini adalah satu-satunya masalah yang saya alami dengan menulis dengan cara ini dan saya melakukannya di sebagian besar file yang saya miliki, tetapi jika ada yang melakukan hal serupa, inilah mengapa ia kehilangan fokus.
sumber
Saya memiliki masalah yang sama dengan tabel html di mana saya memasukkan baris teks dalam kolom. di dalam lingkaran saya membaca objek json dan saya membuat baris khususnya saya memiliki kolom dengan inputtext.
http://reactkungfu.com/2015/09/react-js-loses-input-focus-on-typing/
Saya berhasil menyelesaikannya dengan cara berikut
sumber
Ternyata saya mengikat
this
komponen yang menyebabkannya merender.Saya pikir saya akan mempostingnya di sini jika ada orang lain yang memiliki masalah ini.
Saya harus berubah
Untuk
Memperbaiki sederhana karena dalam kasus saya, saya tidak benar-benar perlu
this
direnderField
, tapi mudah-mudahan saya postingan kehendak ini membantu orang lain.sumber
Saya beralih
value
ke propdefaultValue
. Itu berhasil untuk saya.sumber
Masalah saya adalah saya menamai kunci saya secara dinamis dengan nilai item, dalam kasus saya "name" jadi kuncinya adalah key = {
${item.name}-${index}
}. Jadi ketika saya ingin mengubah input dengan item.name sebagai nilainya, kunci mereka juga akan berubah dan karena itu bereaksi tidak akan mengenali elemen itusumber
Saya mengalami masalah ini dan masalahnya ternyata saya menggunakan komponen fungsional dan menghubungkan dengan status komponen induk. Jika saya beralih menggunakan komponen kelas, masalahnya hilang. Mudah-mudahan ada jalan keluar saat menggunakan komponen fungsional karena jauh lebih nyaman untuk perender barang sederhana dkk.
sumber
menyertakan kode berikutnya dalam masukan tag:
Sebelum:
Setelah:
sumber