2017-07-01 112 views
1

我是React的新手,我決定構建一些簡單的計算器來練習它的基礎知識。然而,我很難理解信息流背後的邏輯,或者有一種方法讓子組件執行邏輯並以自然的方式更新父項。使用子組件中的函數更改父組件的狀態

例如,這是我的計算器的基本結構:

class Calculator extends React.Component { 
    render() { 
     return (
      <div className="calculator-main"> 
       <Screen numberOnScreen={this.state.numberOnScreen}/> 
        <NumberButton number={7} /> 
        <NumberButton number={8} /> 
        <NumberButton number={9} /> 
        <OperatorButton operator="plus" view="-"/> 
       .... 
      </div> 
     ) 
    } 
} 


class Screen extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    render() { 
     return (
      <div className="screen">{new Intl.NumberFormat().format(this.props.numberOnScreen)}</div> 
     ); 
    } 
}; 

class NumberButton extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    render() { 
     const zeroClass = this.props.number === 0 ? " zero" : ""; 
     return (
      <button type="button" className={"number" + zeroClass}>{this.props.number}</button> 
     ); 
    } 
}; 

所以我知道:

  • 我可以創建功能裏面計算器,並將它傳遞爲道具,以 按鈕組件,並在onClick上調用它。 (但它只是覺得奇怪)。
  • 在Calculator組件中創建一個事件監聽器,在按鈕組件中創建 函數,並通過事件 觸發該值; (但感覺是人造的)。
  • 使用某種全球商店?

但是,有沒有自然的反應方式來做到這一點?

謝謝!

+0

你能否詳細說明你的意思是 '自然' 是什麼?我認爲反應的自然方式是將函數從父組件傳遞給子組件,如以下文章中所述:https://facebook.github.io/react/docs/thinking-in-react.html –

+0

是的,我知道這是React背後的邏輯,但是在父組件中而不是在按鈕組件中聲明所有我的函數感覺很混亂......所以我的問題基本上是,「就是這樣」,你需要工作用這種流程,或者是有一種「反應」的方式來把你的邏輯放在子組件中,並更新父進程的狀態。 – Sveta

+1

從技術上講,你可以使用像redux或flux這樣的狀態管理庫來存儲父組件的狀態並編寫邏輯來改變它在子組件中的狀態,所以你不必在父組件中編寫任何邏輯。 –

回答

1

我想你想知道關於React組件通信。在這裏,我已經實施了從小孩到家長的溝通。

在這種情況下,Parent的狀態和狀態改變方法通過道具傳遞給子組件。然後小孩可以改變父母的狀態使用這種方法。

React Component Communication

//Parent component 

class Parent extends React.Component{ 
    constructor(props){ 
     super(props); 
     this.state = { 
      content: 'Initial Content' 
     } 
     this.changeContent = this.changeContent.bind(this); 
    } 

    changeContent(event){ 
     this.setState({ 
      content: event.target.value 
     }) 
    } 

    render(){ 
     let { content } = this.state; 
     return <div> 
      <Child content={content} changeContent={this.changeContent}/> 
      <h1>{content}</h1> 
     </div> 
    } 
} 

// Child component 

class Child extends React.Component{ 
    constructor(props){ 
     super(props); 
    } 

    render(){ 
     let { content, changeContent } = this.props; 
     return <input value={content} onChange={changeContent}/> 
    } 
} 
+0

謝謝,以爲我提到我知道這個選項:)我只是不喜歡你需要如何實現父內部的邏輯。我想我只能依靠D-reaper建議的依靠redux或類似的庫。 – Sveta

+0

這個例子有本地狀態。你想將狀態轉移到redux嗎?如果你想將狀態移動到redux,我用redux改變我的例子。 – Vasi

相關問題