2017-01-14 70 views
11

我剛開始學習React和JavaScript。
在閱讀本教程的過程中,我學習了組件的示例代碼,該代碼創建了一個切換按鈕。
這是部分代碼:React setState +'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 
     })); 
    } 

兩件事:

  1. 沒有了prevState說法從何而來?
    在調用它之前,我沒有看到類似var prevState = this.state;的東西,但它仍然有效。
  2. 箭頭函數的語法:爲什麼箭頭後面的圓括號?
    爲什麼通常的arg => { statement; }語法在這裏工作?

很抱歉的新手問題...

+0

單行箭頭功能不需要{},但它可以被用作這樣的。 'prevState'只是回調的一個參數,它本質上存儲在回答中。 –

回答

16
  1. prevStateReactprops,這兩者都是可選一起提供。

  2. 圓括號允許多行,如果您沒有使用圓括號,您將被迫使用return。你可以使用一條線,但你不需要大括號。

    • 更新:我忘記提到一個具體的情況,它需要括號。如果您要返回沒有return語句的對象,則必須將其包含在括號內。謝謝@joedotnot捕捉。所以() => {foo: true}會拋出一個錯誤,因爲它看起來像一個函數,並且foo: true是無效的行。爲了解決這個問題,必須像() => ({ foo: true })
+0

答案2對我的情況沒有解釋。如果我使用this.setState( \t(prevState)=>({counter:prevState.counter + 1}));全部在一條線上工作。但a)沒有花括號,它會出錯。和b)沒有標準括號沒有錯誤,但根本不增加。因此,對於我來說,我需要這樣的箭頭語法的RHS這兩個括號this.setState((prevState)=>({key:value})); – joedotnot

+0

你是對的,我錯過了解釋。當你返回一個對象時,如果你沒有'return'語句,你必須把它包含在括號中。我會更新我的答案。 –