Aviso: Um componente está alterando uma entrada não controlada do tipo de texto a ser controlado. Os elementos de entrada não devem mudar de não controlado para controlado (ou vice-versa). Decida entre usar um elemento de entrada controlado ou não controlado durante a vida útil do componente. *
A seguir está o meu 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
fonte
fonte
fields
no estado?Respostas:
O motivo é que, no estado que você definiu:
campos como um objeto em branco, por isso durante a primeira prestação
this.state.fields.name
seráundefined
, eo campo de entrada terá o seu valor como:Por esse motivo, o campo de entrada se tornará descontrolado.
Depois de inserir qualquer valor na entrada, o
fields
estado in é alterado para:E nesse momento o campo de entrada é convertido em um componente controlado; é por isso que você está recebendo o erro:
Soluções possíveis:
1- Defina o
fields
estado in como:2- Ou defina a propriedade value usando a avaliação de curto-circuito da seguinte maneira:
fonte
''
é um valor de sequência válido. portanto, quando você muda''
para 'xyz', o tipo de entrada não muda os meios controlados para controlados. Mas no casoundefined
daxyz
tipo mudará de descontrolada controlada.value={this.state.fields.name || ''}
Alterar
value
paradefaultValue
resolverá isso.Nota :
Eu usei
value={this.state.input ||""}
eminput
se livrar desse aviso.fonte
Dentro do componente, coloque a caixa de entrada da seguinte maneira.
fonte
SIMPLESMENTE, você deve definir o estado inicial primeiro
Se você não definir o estado inicial, o reagir tratará isso como um componente não controlado
fonte
Além da resposta aceita, se você estiver usando um
input
tipocheckbox
ouradio
, descobri que preciso verificar nulo / indefinido ochecked
atributo também.E se você estiver usando TS (ou Babel), poderá usar coalescimento nulo em vez do operador OR lógico:
fonte
Definir o estado atual primeiro
...this.state
É porque quando você vai atribuir um novo estado, ele pode estar indefinido. por isso será corrigido definindo o estado que extrai o estado atual também
Se houver um objeto em seu estado, você deve definir o estado da seguinte forma, suponha que você precise definir o nome de usuário dentro do objeto de usuário.
fonte
gera erro assim que você digita no campo de texto
irá corrigir o problema neste exemplo de string.
fonte
Se você usar várias entradas no campo, siga: Por exemplo:
Pesquise seu problema em:
fonte
O uso de ganchos de reação também não se esqueça de definir o valor inicial.
Eu estava usando
<input type='datetime-local' value={eventStart} />
e inicialeventStart
era comoconst [eventStart, setEventStart] = useState();
em vez disso
const [eventStart, setEventStart] = useState('');
.A cadeia vazia entre parênteses é a diferença.
Além disso, se você redefinir o formulário após o envio como eu, novamente, será necessário configurá-lo como sequência vazia, não apenas entre parênteses vazios.
Esta é apenas minha pequena contribuição para esse tópico, talvez isso ajude alguém.
fonte
No meu caso, foi praticamente o que a principal resposta de Mayank Shukla diz. O único detalhe era que meu estado carecia completamente da propriedade que eu estava definindo.
Por exemplo, se você tiver este estado:
Se você estiver expandindo seu código, poderá adicionar um novo suporte. Em outro lugar, você poderá criar uma nova propriedade
c
cujo valor não seja apenas indefinido no estado do componente, mas na própria propriedade seja definida.Para resolver isso, certifique-se de adicionar
c
ao seu estado e fornecer um valor inicial adequado.por exemplo,
Espero ter sido capaz de explicar meu caso extremo.
fonte
Estou recebendo o mesmo aviso: Um componente está alterando uma entrada não controlada do tipo oculta para ser controlada. Não consigo resolver o meu problema. Alguma idéia do porquê?
eu tentei
({ valueName, valueName: {geschlecht=""}, onChangeAllg,})
evalue={valueName.geschlecht || ""}
fonte
defaultValue={""}
Faltava um interior do TextFieldAviso: Um componente está alterando uma entrada não controlada do tipo de texto a ser controlado. Os elementos de entrada não devem mudar de não controlado para controlado (ou vice-versa). Decida entre usar um elemento de entrada controlado ou não controlado durante a vida útil do componente.
Solução: verifique se o valor não está indefinido
React / Formik / Bootstrap / TypeScript
exemplo:
fonte