Curioso, qual é a maneira correta de abordar isso:
var Hello = React.createClass({
getInitialState: function() {
return {total: 0, input1:0, input2:0};
},
render: function() {
return (
<div>{this.state.total}<br/>
<input type="text" value={this.state.input1} onChange={this.handleChange} />
<input type="text" value={this.state.input2} onChange={this.handleChange} />
</div>
);
},
handleChange: function(e){
this.setState({ ??? : e.target.value});
t = this.state.input1 + this.state.input2;
this.setState({total: t});
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
Obviamente, você pode criar funções handleChange separadas para lidar com cada entrada diferente, mas isso não é muito bom. Da mesma forma, você pode criar um componente apenas para uma entrada individual, mas eu queria ver se há uma maneira de fazer isso assim.
javascript
reactjs
jsx
T3db0t
fonte
fonte
this.setState({ [e.target.name]: e.target.value });
Você pode usar o
.bind
método para criar previamente os parâmetros para ohandleChange
método. Seria algo como:(Também fiz com que
total
fosse computado no momento da renderização, pois é a coisa recomendada a fazer.)fonte
this.handleChange.bind(...)
cria uma nova função. No caso de você estiver usandoshouldComponentUpdate
comPureRenderMixin
ou algo semelhante ele vai quebrar. Todos os seus componentes de entrada serão renderizados novamente quando um único valor for alterado.handleChange
para,handleChange(name) { return event => this.setState({name: event.target.value}); }
poderá passar a função "mesma" (não criará uma nova função como é feita usando.bind()
Then, você pode passar essa função:this.handleChange("input1")
this.setState(change, function () { console.log(this.state.input1); );
referência: stackoverflow.com/questions/30782948/…O
onChange
evento borbulha ... Então você pode fazer algo assim:E seu método setField pode ficar assim (supondo que você esteja usando o ES2015 ou posterior:
Eu uso algo semelhante a isso em vários aplicativos, e é bastante útil.
fonte
Solução preterida
valueLink/checkedLink
foram descontinuados do núcleo React, porque está confundindo alguns usuários. Esta resposta não funcionará se você usar uma versão recente do React. Mas se você gosta, pode emular facilmente criando seu próprioInput
componenteConteúdo antigo da resposta:
O que você deseja alcançar pode ser muito mais facilmente alcançado usando os auxiliares de ligação de dados bidirecionais do React.
Fácil né?
http://facebook.github.io/react/docs/two-way-binding-helpers.html
Você pode até implementar seu próprio mixin
fonte
Você também pode fazer assim:
fonte
[]
ao redorinput
em setState. Isso faz com que a propriedade dynamicaly atribuídoVocê pode usar um
React
atributo especial chamadoref
e, em seguida, combinar os nós DOM reais noonChange
evento usandoReact
agetDOMNode()
função de:fonte
prev
é apenas um nome, que pus norender()
métodoevent.target === this.refs.prev
. facebook.github.io/react/blog/2015/10/07/…@Vigril Disgr4ce
Quando se trata de formulários de vários campos, faz sentido usar o recurso principal do React: componentes.
Nos meus projetos, crio componentes TextField, que assumem um valor mínimo e cuidam de lidar com comportamentos comuns de um campo de texto de entrada. Dessa forma, você não precisa se preocupar em acompanhar os nomes dos campos ao atualizar o estado do valor.
fonte
Você pode acompanhar o valor de cada filho
input
, criando umInputField
componente separado que gerencia o valor de um únicoinput
. Por exemplo,InputField
poderia ser:Agora, o valor de cada um
input
pode ser rastreado em uma instância separada desseInputField
componente sem criar valores separados no estado do pai para monitorar cada componente filho.fonte
Vou fornecer uma solução realmente simples para o problema. Suponha que tenhamos duas entradas
username
epassword
, mas queremos que nosso identificador seja fácil e genérico, para podermos reutilizá-lo e não escrever código padrão.I.Our formulário:
II.O nosso construtor, que queremos salvar
username
epassword
, para que possamos acessá-los facilmente:III.O identificador interessante e "genérico", com apenas um
onChange
evento, é baseado nisso:Deixe-me explicar:
1. Quando uma alteração é detectada,
onChange(event)
é chamada2.Em seguida, obtemos o parâmetro name do campo e seu valor:
let inputName = event.target.name; ex: username
let value = event.target.value; ex: itsgosho
3.Com base no parâmetro name, obtemos nosso valor do estado no construtor e atualizamos com o valor:
this.state['username'] = 'itsgosho'
4.A chave a ser observada aqui é que o nome do campo deve corresponder ao nosso parâmetro no estado
Espero ter ajudado alguém de alguma forma :)
fonte
A chave do seu estado deve ser igual ao nome do seu campo de entrada. Então você pode fazer isso no método handleEvent;
fonte
Oi melhoramos resposta ssorallen . Você não precisa vincular a função porque pode acessar a entrada sem ela.
fonte