Advertencia: Un componente está cambiando una entrada no controlada de texto de tipo a controlar. Los elementos de entrada no deben cambiar de no controlado a controlado (o viceversa). Decida entre usar un elemento de entrada controlado o no controlado durante la vida útil del componente. *
El siguiente es mi código:
constructor(props) {
super(props);
this.state = {
fields: {},
errors: {}
}
this.onSubmit = this.onSubmit.bind(this);
}
....
onChange(field, e){
let fields = this.state.fields;
fields[field] = e.target.value;
this.setState({fields});
}
....
render() {
return(
<div className="form-group">
<input
value={this.state.fields["name"]}
onChange={this.onChange.bind(this, "name")}
className="form-control"
type="text"
refs="name"
placeholder="Name *"
/>
<span style={{color: "red"}}>{this.state.errors["name"]}</span>
</div>
)
}
javascript
reactjs
Riya Kapuria
fuente
fuente
fields
en estado?Respuestas:
La razón es que, en el estado que definiste:
campos como un objeto en blanco, por lo que durante la primera representación
this.state.fields.name
seráundefined
, y el campo de entrada obtendrá su valor como:Debido a eso, el campo de entrada quedará sin control.
Una vez que ingresa cualquier valor en la entrada, el
fields
estado cambia a:Y en ese momento el campo de entrada se convierte en un componente controlado; es por eso que obtienes el error:
Soluciones posibles:
1- Defina el
fields
estado de entrada como:2- O defina la propiedad de valor utilizando la evaluación de cortocircuito de esta manera:
fuente
''
es un valor de cadena válido. así que cuando cambia''
a 'xyz', el tipo de entrada no cambia significa controlado a controlado. Pero en caso deundefined
quexyz
el tipo va a cambiar a partir incontrolada de control.value={this.state.fields.name || ''}
Cambiar
value
adefaultValue
lo resolverá.Nota :
He utilizado
value={this.state.input ||""}
eninput
deshacerse de esa advertencia.fuente
Dentro del componente coloque el cuadro de entrada de la siguiente manera.
fuente
SIMPLEMENTE, primero debe establecer el estado inicial
Si no configura el estado inicial, reaccionar lo tratará como un componente no controlado
fuente
Además de la respuesta aceptada, si está utilizando un
input
tipocheckbox
oradio
, he descubierto que también necesito verificar elchecked
atributo nulo / indefinido .Y si está utilizando TS (o Babel), podría usar la fusión nula en lugar del operador lógico OR:
fuente
Establecer el estado actual primero
...this.state
Es porque cuando va a asignar un nuevo estado puede ser indefinido. por lo que se solucionará estableciendo el estado extrayendo el estado actual
Si hay un objeto en su estado, debe establecer el estado de la siguiente manera, supongamos que tiene que establecer el nombre de usuario dentro del objeto de usuario.
fuente
genera un error tan pronto como escribe en el campo de texto
solucionará el problema en este ejemplo de cadena.
fuente
Si usa múltiples entradas en el campo, siga: Por ejemplo:
Busque su problema en:
fuente
El uso de React Hooks tampoco se olvida de establecer el valor inicial.
Estaba usando
<input type='datetime-local' value={eventStart} />
y la inicialeventStart
era comoconst [eventStart, setEventStart] = useState();
en su lugar
const [eventStart, setEventStart] = useState('');
.La cadena vacía entre paréntesis es la diferencia.
Además, si restablece el formulario después de enviarlo como lo hago, nuevamente debe establecerlo en una cadena vacía, no solo para vaciar los paréntesis.
Esta es solo mi pequeña contribución a este tema, tal vez ayude a alguien.
fuente
En mi caso, fue más o menos lo que dice la respuesta principal de Mayank Shukla. El único detalle fue que mi estado carecía por completo de la propiedad que estaba definiendo.
Por ejemplo, si tiene este estado:
Si está expandiendo su código, es posible que desee agregar un nuevo accesorio, por lo tanto, en otro lugar en su código, puede crear una nueva propiedad
c
cuyo valor no solo esté indefinido en el estado del componente, sino que la propiedad en sí no esté definida.Para resolver esto, solo asegúrese de agregar
c
a su estado y darle un valor inicial adecuado.p.ej,
Espero haber podido explicar mi caso límite.
fuente
Recibo la misma advertencia: un componente está cambiando una entrada no controlada de tipo oculto para ser controlado. No puedo solucionar mi problema. Alguna idea de por qué?
lo intenté
({ valueName, valueName: {geschlecht=""}, onChangeAllg,})
yvalue={valueName.geschlecht || ""}
fuente
defaultValue={""}
Faltaba un interior del TextFieldAdvertencia: Un componente está cambiando una entrada no controlada de texto de tipo a controlar. Los elementos de entrada no deben cambiar de no controlado a controlado (o viceversa). Decida entre usar un elemento de entrada controlado o no controlado durante la vida útil del componente.
Solución: compruebe si el valor no está indefinido
Reaccionar / Formik / Bootstrap / TypeScript
ejemplo:
fuente