Ciekawe, jaki jest właściwy sposób podejścia do tego:
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'));
Oczywiście można utworzyć oddzielne funkcje handleChange do obsługi każdego innego wejścia, ale to niezbyt przyjemne. Podobnie możesz utworzyć komponent tylko dla indywidualnego wejścia, ale chciałem sprawdzić, czy istnieje sposób, aby to zrobić w ten sposób.
javascript
reactjs
jsx
T3db0t
źródło
źródło
this.setState({ [e.target.name]: e.target.value });
Możesz użyć tej
.bind
metody, aby wstępnie skompilować parametryhandleChange
metody. To byłoby coś takiego:(Wykonałem również
total
obliczenia w czasie renderowania, ponieważ jest to zalecane).źródło
this.handleChange.bind(...)
tworzy nową funkcję. W przypadku, gdy używaszshouldComponentUpdate
zPureRenderMixin
lub coś podobnego będzie przerwa. Wszystkie komponenty wejściowe zostaną ponownie wyrenderowane po zmianie jednej wartości.handleChange
nahandleChange(name) { return event => this.setState({name: event.target.value}); }
, możesz przekazać "tę samą" funkcję (nie utworzysz nowej funkcji, jak jest to zrobione przy użyciu.bind()
To, możesz przekazać taką funkcję:this.handleChange("input1")
this.setState(change, function () { console.log(this.state.input1); );
reference: stackoverflow.com/questions/30782948/…onChange
Wydarzenie bąbelki ... Więc można zrobić coś takiego:Twoja metoda setField może wyglądać następująco (zakładając, że używasz ES2015 lub nowszego:
Używam czegoś podobnego do tego w kilku aplikacjach i jest to całkiem przydatne.
źródło
Przestarzałe rozwiązanie
valueLink/checkedLink
są przestarzałe z Core React, ponieważ dezorientują niektórych użytkowników. Ta odpowiedź nie zadziała, jeśli używasz najnowszej wersji React. Ale jeśli ci się spodoba, możesz łatwo emulować go, tworząc własnyInput
komponentTreść starej odpowiedzi:
To, co chcesz osiągnąć, można znacznie łatwiej osiągnąć za pomocą pomocników 2-drożnego wiązania danych React.
Łatwe, prawda?
http://facebook.github.io/react/docs/two-way-binding-helpers.html
Możesz nawet zaimplementować swój własny mixin
źródło
Możesz to również zrobić w ten sposób:
źródło
[]
okołoinput
do setstate. To sprawia, że nieruchomość jest przypisywana dynamicznieMożna użyć specjalnego
React
atrybut o nazwieref
, a następnie dopasować węzły prawdziwy DOM wonChange
przypadku korzystaniaReact
„sgetDOMNode()
funkcję:źródło
prev
to tylko nazwa, którąrender()
event.target === this.refs.prev
. facebook.github.io/react/blog/2015/10/07/…@Vigril Disgr4ce
Jeśli chodzi o formularze wielopolowe, sensowne jest użycie kluczowej cechy Reacta: komponentów.
W moich projektach tworzę komponenty TextField, które przyjmują co najmniej wartość właściwości i zajmują się obsługą typowych zachowań wejściowego pola tekstowego. W ten sposób nie musisz martwić się o śledzenie nazw pól podczas aktualizowania stanu wartości.
źródło
Możesz śledzić wartość każdego dziecka
input
, tworząc oddzielnyInputField
komponent, który zarządza wartością pojedynczegoinput
. Na przykładInputField
może to być:Teraz każda wartość
input
może być śledzone w oddzielnej instancji tegoInputField
komponentu bez tworzenia odrębnych wartości w stanie rodzica monitorować każdy element podrzędny.źródło
Zapewnię naprawdę proste rozwiązanie problemu. Załóżmy, że mamy dwa wejścia
username
ipassword
, ale chcemy, aby nasz uchwyt był łatwy i ogólny, abyśmy mogli go ponownie wykorzystać i nie pisać kodu standardowego.I nasza forma:
II. Nasz konstruktor, którego chcemy zapisać
username
ipassword
abyśmy mieli do nich łatwy dostęp:III. Interesujące i „ogólne” podejście z tylko jednym
onChange
zdarzeniem opiera się na tym:Pozwól mi wyjaśnić:
1. Po wykryciu zmiany
onChange(event)
wywoływana jest funkcjaNastępnie otrzymujemy parametr nazwy pola i jego wartość:
let inputName = event.target.name; ex: username
let value = event.target.value; ex: itsgosho
Na podstawie parametru name pobieramy naszą wartość ze stanu w konstruktorze i aktualizujemy ją o wartość:
this.state['username'] = 'itsgosho'
4. Kluczową kwestią jest to, że nazwa pola musi być zgodna z naszym parametrem w stanie
Mam nadzieję, że komuś jakoś pomogłem :)
źródło
Klucz twojego stanu powinien być taki sam jak nazwa twojego pola wejściowego. Następnie możesz to zrobić w metodzie handleEvent;
źródło
Cześć, poprawiłem ssorallen odpowiedź. Nie musisz wiązać funkcji, ponieważ możesz uzyskać dostęp do wejścia bez niej.
źródło