Saya mencoba membuat formulir sederhana dengan react, tetapi menghadapi kesulitan karena data terikat dengan benar ke defaultValue formulir.
Perilaku yang saya cari adalah ini:
- Saat saya membuka halaman saya, bidang input Teks harus diisi dengan teks AwayMessage saya di database saya. Itu adalah "Contoh Teks"
- Idealnya saya ingin memiliki tempat penampung di bidang input Teks jika AwayMessage di database saya tidak memiliki teks.
Namun, saat ini, saya menemukan bahwa bidang input Teks kosong setiap kali saya menyegarkan halaman. (Meskipun apa yang saya ketikkan ke dalam input memang menyimpan dengan benar dan bertahan.) Saya pikir ini karena html kolom teks input dimuat ketika AwayMessage adalah objek kosong, tetapi tidak menyegarkan ketika awayMessage dimuat. Selain itu, saya tidak dapat menentukan nilai default untuk bidang tersebut.
Saya menghapus beberapa kode untuk kejelasan (yaitu onToggleChange)
window.Pages ||= {}
Pages.AwayMessages = React.createClass
getInitialState: ->
App.API.fetchAwayMessage (data) =>
@setState awayMessage:data.away_message
{awayMessage: {}}
onTextChange: (event) ->
console.log "VALUE", event.target.value
onSubmit: (e) ->
window.a = @
e.preventDefault()
awayMessage = {}
awayMessage["master_toggle"]=@refs["master_toggle"].getDOMNode().checked
console.log "value of text", @refs["text"].getDOMNode().value
awayMessage["text"]=@refs["text"].getDOMNode().value
@awayMessage(awayMessage)
awayMessage: (awayMessage)->
console.log "I'm saving", awayMessage
App.API.saveAwayMessage awayMessage, (data) =>
if data.status == 'ok'
App.modal.closeModal()
notificationActions.notify("Away Message saved.")
@setState awayMessage:awayMessage
render: ->
console.log "AWAY_MESSAGE", this.state.awayMessage
awayMessageText = if this.state.awayMessage then this.state.awayMessage.text else "Placeholder Text"
`<div className="away-messages">
<div className="header">
<h4>Away Messages</h4>
</div>
<div className="content">
<div className="input-group">
<label for="master_toggle">On?</label>
<input ref="master_toggle" type="checkbox" onChange={this.onToggleChange} defaultChecked={this.state.awayMessage.master_toggle} />
</div>
<div className="input-group">
<label for="text">Text</label>
<input ref="text" onChange={this.onTextChange} defaultValue={awayMessageText} />
</div>
</div>
<div className="footer">
<button className="button2" onClick={this.close}>Close</button>
<button className="button1" onClick={this.onSubmit}>Save</button>
</div>
</div>
console.log saya untuk AwayMessage menampilkan yang berikut:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
sumber
Cara lain untuk memperbaikinya adalah dengan mengubah
key
input.Pembaruan: Karena ini mendapatkan suara positif, saya harus mengatakan bahwa Anda harus memiliki
disabled
ataureadonly
prop dengan benar saat konten sedang dimuat, jadi Anda tidak mengurangi pengalaman ux.Dan ya, kemungkinan besar ini adalah peretasan, tetapi berhasil menyelesaikannya .. ;-)
sumber
select
dengankey
sepertidefaultValue
yang sebenarnyavalue
.key
input adalah kunci untuk mendapatkan nilai baru yang tercermin dalam input. Saya menggunakannya dengantype="text"
sukses.Mungkin bukan solusi terbaik, tetapi saya akan membuat komponen seperti di bawah ini sehingga saya dapat menggunakannya kembali di mana saja dalam kode saya. Saya berharap itu sudah bereaksi secara default.
Komponennya mungkin terlihat seperti:
Di mana perubahan dengan array adalah fungsi yang mengakses hash dengan jalur yang diekspresikan oleh array
sumber
Cara paling andal untuk menyetel nilai awal adalah dengan menggunakan componentDidMount () {} selain render () {}:
Anda mungkin merasa mudah untuk menghancurkan elemen dan menggantinya dengan yang baru dengan
seperti ini:
Anda juga dapat menggunakan versi metode unmount ini:
sumber
Beri nilai pada parameter "placeHolder". Sebagai contoh :-
sumber