2017-07-01 2 views
1

Ich bin neu in React und habe mich entschieden, etwas Einfaches wie einen Rechner zu erstellen, um die Grundlagen zu üben. Allerdings habe ich einige Schwierigkeiten, die Logik hinter dem Informationsfluss zu verstehen, und entweder gibt es eine Möglichkeit für eine untergeordnete Komponente, die Logik zu tun und das Elternelement auf natürliche Weise zu aktualisieren.Ändern des Status einer übergeordneten Komponente mithilfe einer Funktion in der untergeordneten Komponente

Zum Beispiel dies die Grundstruktur meines Rechners ist:

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> 
     ); 
    } 
}; 

So weiß ich, dass:

  • ich die Funktionen innerhalb Rechner erstellen und es als Stütze zu den Tasten passiert Komponenten, und rufen Sie onClick. (Aber es fühlt sich einfach seltsam an).
  • Erstellen Sie einen Ereignis-Listener in der Calculator-Komponente, erstellen Sie die -Funktion innerhalb der Schaltflächenkomponente und übergeben Sie den Wert über das Ereignis trigger; (Aber es fühlt sich künstlich an).
  • Verwenden Sie eine Art von Global Store?

Aber gibt es keine natürliche Reaktion, dies zu tun?

Danke!

+0

Könnten Sie erarbeiten, was Sie durch 'natürliche' bedeuten? Ich dachte, der natürliche Weg für die Reaktion ist es, die Funktion von der Elternkomponente zu den Kinderkomponenten zu übergeben, wie in dem Artikel hier erwähnt: https://facebook.github.io/react/docs/thinking-in-react.html –

+0

Ja, ich weiß, dass dies die Logik hinter React ist, aber es fühlt sich unordentlich an, alle meine Funktionen in der Elternkomponente zu deklarieren, eher in den Tastenkomponenten ... Also meine Frage ist im Grunde, ist "das ist es" und du musst arbeiten mit diesem Fluss, oder gibt es einen "reaktiven" Weg, um Ihre Logik in die Kindkomponenten zu bringen und den Zustand des Elternteils zu aktualisieren. – Sveta

+1

Technisch gesehen können Sie eine Zustandsverwaltungsbibliothek wie redux oder flux verwenden, um den Status der übergeordneten Komponente zu speichern und die Logik zu schreiben, um ihren Status in der untergeordneten Komponente zu ändern, sodass Sie keine Logik in der übergeordneten Komponente schreiben müssen. –

Antwort

1

Ich denke, dass Sie über React Komponente Kommunikation wissen wollen. Hier habe ich die Child to Parent-Kommunikation implementiert.

In diesem Fall wird die Status- und Statusänderungsmethode von Parent über Requisiten an die untergeordnete Komponente übergeben. Dann kann das Kind den Status des Elternteils ändern und diese Methode verwenden.

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

Danke, dachte ich erwähnte ich bin mir dieser Option bewusst :) Ich mag es einfach nicht, wie Sie die Logik in den Eltern implementieren müssen. Ich denke, dass ich mich nur auf Redux oder eine ähnliche Bibliothek verlassen muss, wie D-Reaper vorgeschlagen hat. – Sveta

+0

Dieses Beispiel hat einen lokalen Status. Möchten Sie den Status in redux verschieben? Wenn Sie den Status in redux verschieben möchten, ändere ich mein Beispiel mit redux. – Vasi

Verwandte Themen