2017-01-14 11 views
11

Właśnie zacząłem uczyć się React i JavaScript.
Podczas przechodzenia przez samouczek, dostałem się do tego przykładu kodu komponentu, który tworzy przycisk przełączania.
Jest to część kodu:React setState + Skąd pochodzi "prevState"?

class Toggle extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = {isToggleOn: true}; 
     this.handleClick = this.handleClick.bind(this); 
    } 

    handleClick() { 
     this.setState(prevState => ({ // prevState? 
      isToggleOn: !prevState.isToggleOn 
     })); 
    } 

2 rzeczy, które są podsłuch mnie tutaj:

  1. Skąd prevState argumentem pochodzi?
    Przed wywołaniem nie widzę czegoś takiego jak var prevState = this.state;, a mimo to działa.
  2. Składnia funkcji strzałki: dlaczego nawiasy za strzałką?
    Dlaczego nie działa tutaj zwykła składnia arg => { statement; }?

Przepraszam za pytania początkujących ...

+0

Pojedyncza funkcja linia strzałka nie wymaga {}, ale może być stosowany jako taki. 'prevState' jest po prostu parametrem wywołania zwrotnego, jest przechowywany natywnie w reakcji –

Odpowiedz

16
  1. prevState zapewnia React wraz z props, z których oba są opcjonalne.

  2. Nawias pozwala na wiele linii, w przypadku gdy nie użyłeś nawiasów, będziesz zmuszony użyć return. Możesz użyć pojedynczej linii, ale nie potrzebujesz nawiasów klamrowych.

    • Aktualizacja: Zapomniałem wspomnieć o szczególnym przypadku, gdy wymagane jest mieć nawias. Jeśli zwracasz obiekt bez instrukcji return, musisz zawinąć go w nawias. Dziękuję @joedotnot za złapanie tego. Tak więc () => {foo: true} wywoła błąd, ponieważ wygląda jak funkcja, a foo: true jest nieprawidłową linią. Aby rozwiązać ten problem musi wyglądać () => ({ foo: true })
+0

Odpowiedź 2. nie wyjaśnia tego w moim przypadku. Jeśli użyję this.setState ( \t (prevState) => ({counter: prevState.counter + 1})); wszystko w jednym wierszu działa. ALE a) bez nawiasów klamrowych, będzie to błąd. oraz b) bez standardowych nawiasów nie ma błędu, ale w ogóle nie wzrasta. Tak więc dla mnie wymaga obu nawiasów na składni strzałki RHS jak this.setState ((prevState) => ({key: value})); – joedotnot

+0

Masz rację, to jest przypadek, którego nie udało mi się wyjaśnić. Kiedy zwracasz obiekt, musisz zawinąć go w nawias, jeśli nie masz instrukcji "return". Zaktualizuję moją odpowiedź. –

Powiązane problemy