Saya mencoba React.js pertama saya dan saya bingung sejak awal ... Saya memiliki kode di bawah ini, yang membuat formulir pencarian menjadi <div id="search"></div>
. Tetapi mengetik di kotak pencarian tidak melakukan apa-apa.
Agaknya ada sesuatu yang hilang melewati props dan keadaan naik turun, dan ini sepertinya masalah umum. Tapi saya bingung - saya tidak bisa melihat apa yang hilang.
var SearchFacet = React.createClass({
handleChange: function() {
this.props.onUserInput(
this.refs.searchStringInput.value
)
},
render: function() {
return (
<div>
Search for:
<input
type="text"
value={this.props.searchString}
ref="searchStringInput"
onchange={this.handleChange} />
</div>
);
}
});
var SearchTool = React.createClass({
render: function() {
return (
<form>
<SearchFacet
searchString={this.props.searchString}
onUserInput={this.props.onUserInput}
/>
<button>Search</button>
</form>
);
}
});
var Searcher = React.createClass({
getInitialState: function() {
return {
searchString: ''
}
},
handleUserInput: function(searchString) {
this.setState({
searchString: searchString
})
},
render: function() {
return (
<div>
<SearchTool
searchString={this.state.searchString}
onUserInput={this.handleUserInput}
/>
</div>
);
}
});
ReactDOM.render(
<Searcher />,
document.getElementById('searcher')
);
(Akhirnya saya akan memiliki jenis lain SearchFacet*
tetapi saya hanya mencoba membuat yang ini berfungsi.)
javascript
reactjs
Phil Gyford
sumber
sumber
this
saat Anda memasukkan bidang teks. Bisa jadi ituthis
bukanSearcher
komponennya lagi.this
pada titik mana dalam kode? Mencoba masukSearcher.handleUserInput()
atauSearchFacet.handleChange()
tidak melakukan apa pun.Jawaban:
Anda belum membungkus
onchange
prop Anda dengan benar diinput
. Itu harusonChange
di BEJ.Topik meneruskan
value
prop ke<input>
, dan kemudian entah bagaimana mengubah nilai yang diteruskan sebagai respons terhadap interaksi pengguna menggunakanonChange
penangan cukup dipertimbangkan dalam dokumen .Mereka merujuk ke input seperti Komponen Terkontrol , dan merujuk ke input yang memungkinkan DOM menangani nilai input dan perubahan selanjutnya dari pengguna sebagai Komponen Tidak Terkontrol .
Setiap kali Anda menyetel
value
prop dari suatuinput
ke beberapa variabel, Anda memiliki Komponen Terkendali . Ini berarti Anda harus mengubah nilai variabel dengan beberapa cara terprogram atau input akan selalu menyimpan nilai itu dan tidak akan pernah berubah, bahkan saat Anda mengetik - perilaku asli dari input, untuk memperbarui nilainya saat mengetik, diganti dengan React here.Jadi, Anda benar mengambil variabel itu dari keadaan, dan memiliki penangan untuk memperbarui keadaan semua disiapkan dengan baik. Masalahnya adalah karena Anda memiliki
onchange
dan tidak benaronChange
penangan tidak pernah dipanggil dan karenanyavalue
tidak pernah diperbarui saat Anda mengetik ke dalam masukan. Ketika Anda menggunakanonChange
pawang yang disebut,value
adalah diperbarui ketika Anda mengetik, dan Anda melihat perubahan Anda.sumber
Menggunakan
value={whatever}
akan membuatnya jadi Anda tidak dapat mengetik di kolom input. Anda harus menggunakandefaultValue="Hello!"
.Lihat https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
Juga,
onchange
harusonChange
seperti yang ditunjukkan @davnicwil.sumber
value={whatever}
danvalue={this.state.myvalue}
. Saya seharusnya membuat klarifikasi ini sebagai gantinya: menggunakanonChange={this.handleChange}
dan sesuatu sepertihandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
membuat bidang bisa berubah lagi.defaultValue
menyelamatkan hari saya.Ini mungkin disebabkan oleh fungsi onChange tidak memperbarui nilai yang tepat yang disebutkan dalam masukan.
Contoh:
dalam fungsi onChange, perbarui bidang nilai yang disebutkan.
sumber
Saya juga memiliki masalah yang sama dan dalam kasus saya, saya menyuntikkan peredam dengan benar tetapi tetap saya tidak bisa mengetik di lapangan. Ternyata jika Anda menggunakan
immutable
Anda harus menggunakanredux-form/immutable
.Perhatikan bahwa negara Anda harus seperti
state->form
jika tidak, Anda harus secara eksplisit mengkonfigurasi perpustakaan juga nama untuk negara harusform
. lihat masalah inisumber
Bagi saya, perubahan sederhana berikut bekerja dengan sempurna
sumber
Dalam konteks komponen kelas ...
Jika metode changeHandler adalah fungsi normal:
bisa digunakan seperti ini ...
onChange={(e)=>this.handleChange(e)}
Jika metode changeHandler adalah fungsi panah:
bisa digunakan seperti ini ...
onChange={this.handle}
Dan ini memecahkan masalah "Can't type in React input text field" saya.
sumber