Saya memiliki komponen reaksi sederhana dengan bentuk yang saya yakini memiliki satu input terkontrol:
import React from 'react';
export default class MyForm extends React.Component {
constructor(props) {
super(props);
this.state = {}
}
render() {
return (
<form className="add-support-staff-form">
<input name="name" type="text" value={this.state.name} onChange={this.onFieldChange('name').bind(this)}/>
</form>
)
}
onFieldChange(fieldName) {
return function (event) {
this.setState({[fieldName]: event.target.value});
}
}
}
export default MyForm;
Ketika saya menjalankan aplikasi saya, saya mendapat peringatan berikut:
Peringatan: MyForm sedang mengubah input teks tipe yang tidak terkontrol untuk dikontrol. Elemen input tidak boleh beralih dari tidak terkontrol ke terkontrol (atau sebaliknya). Putuskan antara menggunakan elemen input yang dikontrol atau tidak dikontrol selama masa pakai komponen
Saya percaya input saya dikontrol karena memiliki nilai. Saya bertanya-tanya apa yang saya lakukan salah?
Saya menggunakan Bereaksi 15.1.0
sumber
name={'question_groups.${questionItem.id}'}
?value
prop memiliki nilai non-null / undefined. Prop tidak perlu berhubungan dengan variabel keadaan (bisa saja berupa konstanta dan komponennya akan tetap dianggap terkontrol). Jawaban Adam lebih benar dan harus diterima.Ketika Anda pertama kali merender komponen Anda,
this.state.name
tidak disetel, jadi ia mengevaluasi keundefined
ataunull
, dan Anda akhirnya melewativalue={undefined}
atauvalue={null}
ke Andainput
.Ketika ReactDOM memeriksa untuk melihat apakah suatu bidang dikontrol, ia memeriksa untuk melihat apakah
value != null
(perhatikan bahwa itu!=
bukan!==
), dan karenaundefined == null
dalam JavaScript, ia memutuskan bahwa bidang itu tidak terkontrol.Jadi, ketika
onFieldChange()
dipanggil,this.state.name
diatur ke nilai string, input Anda berubah dari tidak terkontrol menjadi terkontrol.Jika Anda melakukannya
this.state = {name: ''}
di konstruktor Anda, karena'' != null
, input Anda akan memiliki nilai sepanjang waktu, dan pesan itu akan hilang.sumber
this.props.<whatever>
, yang merupakan masalah pada saya. Terima kasih, Adam!render()
, atau ekspresi dalam tag itu sendiri — apa pun yang dievaluasiundefined
. Senang bisa membantu!name
".undefined
yang pada awalnya disahkan. Sebaliknya, itu fakta yangthis.state.name
tidak ada sebagai variabel keadaan yang membuat input tidak terkontrol. Misalnya, memilikithis.state = { name: undefined };
akan mengakibatkan input dikontrol. Harus dipahami bahwa yang penting adalah dari mana nilai itu berasal, bukan apa nilainya.this.state = { name: undefined }
masih akan menghasilkan input yang tidak terkendali.<input value={this.state.name} />
keinginan untukReact.createElement('input', {value: this.state.name})
. Karena mengakses properti objek yang tidak ada kembaliundefined
, ini mengevaluasi ke panggilan fungsi yang sama persis——React.createElement('input', {value: undefined})
apakahname
tidak diatur atau secara eksplisit diatur keundefined
, jadi Bereaksi berperilaku dengan cara yang sama. Anda bisa melihat perilaku ini di JSFiddle ini.Pendekatan lain bisa dengan menetapkan nilai default di dalam input Anda, seperti ini:
sumber
Saya tahu orang lain sudah menjawab ini. Tetapi faktor yang sangat penting di sini yang dapat membantu orang lain mengalami masalah serupa:
Anda harus memiliki
onChange
penangan yang ditambahkan di bidang input Anda (mis. TextField, kotak centang, radio, dll). Selalu tangani aktivitas melaluionChange
pawang.Contoh:
Saat Anda bekerja dengan kotak centang, Anda mungkin perlu menangani
checked
kondisinya!!
.Contoh:
sumber
Solusi sederhana untuk mengatasi masalah ini adalah dengan menetapkan nilai kosong secara default:
sumber
Satu potensi downside dengan menyetel nilai bidang ke "" (string kosong) di konstruktor adalah jika bidang adalah bidang opsional dan dibiarkan tanpa diedit. Kecuali jika Anda melakukan pemijatan sebelum memposting formulir Anda, bidang tersebut akan tetap disimpan ke data Anda sebagai string kosong alih-alih NULL.
Alternatif ini akan menghindari string kosong:
sumber
Ketika Anda menggunakan
onChange={this.onFieldChange('name').bind(this)}
input Anda, Anda harus mendeklarasikan string kosong status Anda sebagai nilai bidang properti.cara yang salah:
jalan yang benar:
sumber
Dalam kasus saya, saya kehilangan sesuatu yang sangat sepele.
<input value={state.myObject.inputValue} />
Keadaan saya adalah yang berikut ketika saya mendapat peringatan:
Dengan mengganti status saya untuk referensi input nilai saya, masalah saya terpecahkan:
sumber
Jika alat peraga pada komponen Anda diteruskan sebagai keadaan, beri nilai default untuk tag input Anda
sumber
Tetapkan nilai ke properti 'nama' dalam keadaan awal.
sumber
Pembaruan untuk ini. Untuk React Hooks gunakan
const [name, setName] = useState(" ")
sumber
" "
dan tidak""
? Ini menyebabkan Anda kehilangan teks petunjuk, dan jika Anda mengklik dan mengetik Anda mendapat ruang licik sebelum data apa pun yang Anda masukkan.Ini umumnya terjadi hanya ketika Anda tidak mengendalikan nilai yang diajukan ketika aplikasi dimulai dan setelah beberapa peristiwa atau beberapa fungsi dipecat atau negara berubah, Anda sekarang mencoba untuk mengontrol nilai di bidang input.
Transisi tidak memiliki kendali atas input dan kemudian memiliki kendali atas hal inilah yang menyebabkan masalah terjadi.
Cara terbaik untuk menghindari ini adalah dengan mendeklarasikan beberapa nilai untuk input dalam konstruktor komponen. Sehingga elemen input memiliki nilai dari awal aplikasi.
sumber
Untuk menyetel properti keadaan secara dinamis untuk input formulir dan menjaganya tetap terkendali, Anda bisa melakukan sesuatu seperti ini:
sumber
Cukup buat fallback ke '' jika this.state.name adalah nol.
Ini juga berfungsi dengan variabel useState.
sumber