Mam następujący składnik React:
export default class MyComponent extends React.Component {
onSubmit(e) {
e.preventDefault();
var title = this.title;
console.log(title);
}
render(){
return (
...
<form className="form-horizontal">
...
<input type="text" className="form-control" ref={(c) => this.title = c} name="title" />
...
</form>
...
<button type="button" onClick={this.onSubmit} className="btn">Save</button>
...
);
}
};
Konsola daje mi undefined
- jakieś pomysły, co jest nie tak z tym kodem?
javascript
reactjs
JoeTidee
źródło
źródło
this.onSubmit.bind(this);
e.target.value
bez wiązania?onSubmit
metodę z przyciskiem wysyłania (elementem DOM) po kliknięciu (tjonClick={this.onSubmit.bind(this)}
.). A jeśli chcesz uzyskać dostęp do wartości tytułu tytułu w formularzu, którego możesz użyćonSubmit(event) { const title = event.target.elements.title.value; }
.Odpowiedzi:
Należy użyć konstruktora w klasie MyComponent, która rozszerza React.Component
Otrzymasz wynik tytułu
źródło
Istnieją tutaj trzy odpowiedzi, w zależności od wersji React, z którą jesteś (zmuszony) pracować (i) i od tego, czy chcesz użyć haków.
Po pierwsze:
Ważne jest, aby zrozumieć, w jaki sposób reagować prace, dzięki czemu można zrobić rzeczy właściwie (protip: to jest bardzo warto przebiegającej przez React samouczka ćwiczenia na React internetową Jest dobrze napisana i obejmuje wszystkie podstawy w taki sposób, że faktycznie wyjaśnia, jak to zrobić. rzeczy). „Prawidłowo” oznacza tutaj, że piszesz interfejs aplikacji, który jest renderowany w przeglądarce; cała praca interfejsu odbywa się w React, a nie w „tym, do czego jesteś przyzwyczajony, gdy piszesz stronę internetową” (dlatego aplikacje React to „aplikacje”, a nie „strony internetowe”).
Aplikacje React są renderowane na podstawie dwóch rzeczy:
To, czego wyraźnie nie robisz, gdy używasz React, to generowanie elementów HTML, a następnie ich używanie: kiedy mówisz Reactowi, aby
<input>
na przykład używał , np. Nie tworzysz elementu wejściowego HTML, mówisz Reactowi, aby utworzył obiekt wejściowy React które zdarza się renderować jako element wejściowy HTML, a obsługa zdarzeń patrzy na zdarzenia wejściowe elementu HTML, ale nie jest przez nie kontrolowana .Korzystając z React, generujesz elementy interfejsu aplikacji, które prezentują użytkownikowi (często manipulowane) dane, a interakcja użytkownika zmienia stan składnika, co może spowodować ponowne przesłanie części interfejsu aplikacji w celu odzwierciedlenia nowego stanu. W tym modelu stan jest zawsze ostatecznym organem, a nie „dowolną biblioteką interfejsu użytkownika używaną do jego renderowania”, która w sieci WWW jest DOM przeglądarki. W tym modelu programowania DOM jest niemal ponownym przemyśleniem: jest to konkretna struktura interfejsu użytkownika, z której korzysta React.
W przypadku elementu wejściowego logika jest następująca:
render
połączenie po aktualizacji, ale tylko jeśli aktualizacja stanu zmieni stan.Wszystko to dzieje się w ciągu kilku milisekund, jeśli nie mniej, więc wygląda na to, że wpisałeś się do elementu wejściowego w taki sam sposób, w jaki zwykłeś „po prostu używać elementu wejściowego na stronie”, ale to absolutnie nie to stało się.
Powiedziawszy to, jak uzyskać wartości z elementów w React:
Reaguj 15 i poniżej za pomocą ES5
Aby zrobić to poprawnie, twój komponent ma wartość stanu, która jest wyświetlana przez pole wejściowe, i możemy go zaktualizować, sprawiając, że element interfejsu użytkownika wysyła zdarzenia zmiany z powrotem do komponentu:
Tak powiemy React korzystać z
updateInputValue
funkcji do obsługi interakcji użytkownika, użyciesetState
zaplanować aktualizację stanu, oraz fakt, żerender
sięga dothis.state.inputValue
środków, które gdy rerenders po aktualizacji stanu, użytkownik zobaczy tekst aktualizacji w oparciu o to, co wpisane.uzupełnienie na podstawie komentarzy
Biorąc pod uwagę, że dane wejściowe interfejsu użytkownika reprezentują wartości stanu (zastanów się, co się stanie, jeśli użytkownik zamknie kartę w połowie, a karta zostanie przywrócona. Czy wszystkie te wartości, które wprowadzili, powinny zostać przywrócone? Jeśli tak, to stan). To może sprawić, że poczujesz, że duża forma potrzebuje dziesiątek, a nawet stu formularzy wejściowych, ale React polega na modelowaniu interfejsu użytkownika w sposób możliwy do utrzymania: nie masz 100 niezależnych pól wejściowych, masz grupy powiązanych danych wejściowych, więc przechwytujesz każdy zgrupuj w komponencie, a następnie utwórz formularz „master” jako zbiór grup.
Jest to również o wiele łatwiejsze w utrzymaniu niż gigantyczny pojedynczy komponent. Podziel grupy na komponenty z zachowaniem stanu, przy czym każdy komponent odpowiada tylko za śledzenie kilku pól wejściowych na raz.
Może się również wydawać, że napisanie całego kodu jest „kłopotliwe”, ale to fałszywa oszczędność: programiści, którzy nie są Tobą, w tym Ty, w rzeczywistości, czerpią ogromne korzyści z tego, że wszystkie te dane wejściowe są wyraźnie połączone, ponieważ znacznie ułatwia śledzenie ścieżek kodu. Zawsze możesz jednak zoptymalizować. Na przykład możesz napisać linker stanu
Oczywiście istnieją ulepszone wersje tego, więc wejdź na https://npmjs.com i poszukaj rozwiązania łączenia stanu React, które najbardziej Ci się podoba. Open Source polega głównie na znalezieniu tego, co inni już zrobili, i wykorzystaniu tego zamiast pisania wszystkiego od zera.
React 16 (i 15.5 przejściowy) i „nowoczesny” JS
Począwszy od React 16 (i miękkiego startu z 15.5),
createClass
wywołanie nie jest już obsługiwane i należy użyć składni klas. Zmienia to dwie rzeczy: oczywistą składnię klas, ale takżethis
powiązanie kontekstu, którecreateClass
można wykonać „za darmo”, więc aby upewnić się, że wszystko nadal działa, upewnij się, że używasz notacji „gruba strzałka” dlathis
zachowania kontekstu w funkcjachonWhatever
obsługi, takich jakonChange
użycie my w kod tutaj:Możliwe, że widziałeś, jak ludzie używają
bind
konstruktora do wszystkich funkcji obsługi zdarzeń, takich jak:Nie rób tego
Prawie za każdym razem, gdy używasz
bind
, obowiązuje przysłowiowe „robisz to źle”. Twoja klasa już definiuje prototyp obiektu, a więc już definiuje kontekst instancji. Nie kończbind
tego; używaj normalnego przekazywania zdarzeń zamiast duplikowania wszystkich wywołań funkcji w konstruktorze, ponieważ to powielanie zwiększa powierzchnię błędu i znacznie utrudnia śledzenie błędów, ponieważ problem może znajdować się w konstruktorze zamiast w miejscu, w którym wywołujesz kod. Oprócz nakładania ciężarów związanych z utrzymaniem na inne osoby, z którymi (z wyboru lub z wyboru) współpracujesz.Tak, wiem, że doktorzy z reakcji mówią, że jest w porządku. Nie, nie rób tego.
Reaguj 16.8, używając komponentów funkcji z zaczepami
Od React 16.8 komponent funkcji (tj. Dosłownie tylko funkcja, która przyjmuje
props
argument jako argument, może być używany tak, jakby był instancją klasy komponentu, bez pisania klasy), może również zostać podany stan, poprzez użycie hooków .Jeśli nie potrzebujesz pełnego kodu klasy, a zadziała funkcja pojedynczej instancji, możesz teraz użyć
useState
haka, aby uzyskać sobie pojedynczą zmienną stanu, i jej funkcję aktualizacji, która działa mniej więcej tak samo jak powyższe przykłady, z wyjątkiem brakusetState
wywołanie funkcji:Wcześniej nieoficjalnym rozróżnieniem między klasami i komponentami funkcji było „komponenty funkcji nie mają stanu”, więc nie możemy się już dłużej za tym kryć: różnica między komponentami funkcji i komponentami klas można znaleźć na kilku stronach bardzo dobrze - pisemna reakcja na dokumentację (bez skrótu wyjaśnienia jednej linijki, aby wygodnie dla ciebie źle zinterpretować!), którą powinieneś przeczytać, abyś wiedział, co robisz, a tym samym wiedzieć, czy wybrałeś najlepsze (cokolwiek to dla ciebie znaczy) rozwiązanie do samodzielnego zaprogramowania z powodu twojego problemu.
źródło
Udało się uzyskać wartość pola wejściowego, wykonując coś takiego:
źródło
W reakcji 16 używam
źródło
Udało mi się to zrobić, wiążąc „to” z funkcją updateInputValue (evt) za pomocą
this.updateInputValue = this.updateInputValue.bind (this);
Jednak wartość wejściowa = {this.state.inputValue} ... nie była dobrym pomysłem.
Oto pełny kod w Babel ES6:
źródło
twój błąd jest spowodowany tym, że używasz klasy, a kiedy używasz klasy, musimy połączyć funkcje z This, aby dobrze działać. w każdym razie istnieje wiele samouczków, dlaczego powinniśmy „to” i co to jest „robić” w javascript.
jeśli poprawisz przycisk wysyłania, powinno to działać:
a także jeśli chcesz pokazać wartość tego wejścia w konsoli, powinieneś użyć var title = this.title.value;
źródło
Podaj
<input>
unikalny identyfikatora następnie użyj standardowego interfejsu API sieci Web, aby odwołać się do niego w DOM
Nie ma potrzeby ciągłego aktualizowania stanu React przy każdym naciśnięciu klawisza. Po prostu uzyskaj wartość, gdy jest wymagana.
źródło
źródło
Można uzyskać wartość wejściową bez dodawania funkcji „onChange”.
Wystarczy dodać do elementu wejściowego „ref attr:
A następnie użyj this.refs, aby uzyskać wartość wejściową, gdy jej potrzebujesz.
źródło
Zmień swoje oznaczenie na:
ref='title'
i usuńname='title'
Następnie usuńvar title = this.title
i napisz:Powinieneś także dodać
.bind(this)
dothis.onSubmit
(Działało w moim przypadku, które było dość podobne, ale zamiast tego
onClick
miałemonSubmit={...}
i zostało zapisane w formie (<form onSubmit={...} ></form>)
)źródło
jeśli używasz komponentu klasy, to tylko 3 kroki - najpierw musisz zadeklarować stan dla swoich danych wejściowych, na przykład this.state = {name: ''} . Po drugie, musisz napisać funkcję do ustawiania stanu, gdy zmienia się ona w poniższym przykładzie, to setName () i na koniec musisz napisać wejściowy jsx, na przykład <wartość wejściowa = {this.name} onChange = {this.setName} />
źródło
źródło
za pomocą niekontrolowanych pól:
źródło