2016-09-26 8 views
2

Meine übergeordnete Komponente, im Grunde ein Formular, hat ein Kind, ein Overlay mit einem Ladeprogramm, das nur basierend auf dem Status des übergeordneten Elements angezeigt werden muss.Dynamische Render-Komponente basierend auf dem übergeordneten Status

import React from 'react'; 
import Overlay from './overlay'; 

export default class RegisterForm extends React.Component { 
    constructor { 
    this.state = { 
     loading: false 
    }; 
    } 
    handleSubmit(){ 
    this.state.loading = true; 
    ... 
    } 

    render(){ 
    return(
    <form onSubmit={() => this.handleSubmit()}> 
    ... 
    <Overlay /> 
    </form> 
    ); 
    } 
} 

Wie kann ich das erreichen?

Ich versuchte React.cloneElement(<Overlay />, {}) aber ich weiß nicht, wie dieses Kind zum Vater wieder anhängen und wie ich sie verstehe, es ist nicht das Reagieren-Weg, Dinge zu tun ...

Ich habe auch versucht eine Einstellung prop ob Overlay basierend auf state der Eltern, wie React.cloneElement(<Overlay />, { visible = this.state.loading }) aber kann nicht scheinen, um es an die Arbeit ...

Antwort

4

nutzen Sie ternären Operator Komponente zu machen. Reagieren JSX unterstützt If-else Logik zum Rendern wie {(this.state.loading == false) ? <Overlay /> : null}

Sie sollten this.setState({loading: true}); verwenden, um den Status anstelle einer direkten Zuweisung zu ändern. Verwenden Sie auch event.preventDefault() in Ihrem handleSubmit();

import React from 'react'; 
import Overlay from './overlay'; 

export default class RegisterForm extends React.Component { 
    constructor { 
    this.state = { 
     loading: false 
    }; 
    } 
    handleSubmit(event){ 
    event.preventDefault(); 
    this.setState({loading: true}); 
    ... 
    } 

    render(){ 
    <form onSubmit {()=>{this.handleSubmit()}> 

    {(this.state.loading == false) ? <Overlay /> : null} 
    </form> 
    } 
} 
+0

Leider ist dies entweder nicht funktioniert. Ich habe versucht '{(this.state.loading == true)? : null} 'und' {(this.state.loading)? : null} 'und' {this.state.loading && } ' – afkatja

+0

Verwenden Sie event.preventDefault in Ihrem handleSubmit. Überprüfen Sie die aktualisierte Antwort –

+0

Ich hatte dies bereits in meinem ursprünglichen Code; in Frage weggelassen (dachte, dass es irrelevant war?) – afkatja

3

Ich würde den Ausdruck unten als ein ternärer Operator für den Fall in Frage

render() { 
    return (
    <form onSubmit={this.handleSubmit}> 
     { this.state.loading == false && <Overlay /> } 
    </form> 
); 
} 

bevorzugt Angemeldet keine Rückkehr Klausel in der Render-Funktion zu verpassen. Denken Sie daran, den Status nicht direkt durch Zuweisung zu ändern. Hier ist eine funktionierende Komponente, die das Formular durch Klicken auf eine Schaltfläche sendet und eine Ladenachricht anzeigt. Dies ist ein typischer React-Weg, um das Verhalten zu erreichen.

class HelloWidget extends React.Component{ 
    constructor(props) { 
    super(props); 
    this.handleSubmit = this.handleSubmit.bind(this) 
    this.state = { 
     loading: false 
    }; 
    } 
    handleSubmit() { 
    this.setState({ loading: true }); 
    } 
    render() { 
    return (
     <form onSubmit={this.handleSubmit}> 
     { this.state.loading && <div>loading...</div> } 
     <button>click</button> 
     </form> 
    ); 
    } 
} 

Anhang - Im Folgenden sind zwei Stenografien Tricks.

Ternary Betreiber:

Stenografie

render() { 
    return condition === someCondition ? <CompA /> : <CompB />; 
} 

Longhand

render() { 
    if (condition === someCondition) { 
    return <CompA />; 
    } else { 
    return <CompB />; 
    } 
} 

Boolesche Operator UND & &:

Stenografie

render() { 
    return condition === someCondition && <CompA />; 
} 

Longhand

render() { 
    if (condition === someCondition) { 
    return <CompA />; 
    } else { 
    return null; 
    } 
} 
+0

Danke! Ich habe versucht 'this.state.loading && ' aber nichts passierte ... – afkatja

+0

Haben Sie das Handle im Konstruktor gebunden? 'this.handleSubmit = this.handleSubmit.bind (this);' – Season

+0

Ich habe die Frage bearbeitet: Mein submit-Handler ist wie folgt 'onSubmit = {() => this.handleSubmit()} ' – afkatja

Verwandte Themen