2015-11-21 10 views
17

Ich bin neue Welt zu reagieren, und ich habe Linie wie folgt aus:onClick rendert keine neue react-Komponente.

<Button onClick={() => console.log("hello")}>Button</Button> 

und klicken Sie hello auf der Konsole gedruckt bekommen. Jetzt die Zeile ändern:

<Button onClick={() => <NewComponent />}>Button</Button> 

jetzt auf Klick auf den Button, erwarte ich, dass die NewComponent gemacht werden. Aber das tut es nicht.

Ich bin mir nicht sicher, warum das der Fall ist. Beachten Sie, dass ich den obigen Code in der render Methode habe.

+0

Das ist einfach nicht wie es funktioniert. Wo würdest du erwarten, dass die Komponente rendert? –

+0

auf der gleichen Seite. – batman

+0

Aber wo? Über dem Knopf? Unter dem Knopf? In der Taste? * Im Attribut 'onClick'? * Irgendwo anders? Momentan ist Ihr Click-Handler etwas wie 'function() {React.createElement (...); } '. Es macht nichts mit dem Element, das erstellt wurde. –

Antwort

31

Sie möchten wahrscheinlich eine Stateful-Komponente haben, die die andere Komponente neben der Schaltfläche anzeigt, nachdem sie geklickt wurde. Alles, was Sie tun müssen, ist verfolgen, ob die Schaltfläche geklickt wurde:

class MyComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     showComponent: false, 
    }; 
    this._onButtonClick = this._onButtonClick.bind(this); 
    } 

    _onButtonClick() { 
    this.setState({ 
     showComponent: true, 
    }); 
    } 

    render() { 
    return (
     <div> 
     <Button onClick={this._onButtonClick}>Button</Button> 
     {this.state.showComponent ? 
      <NewComponent /> : 
      null 
     } 
     </div> 
    ); 
    } 
} 
+0

Hi.was wenn ich nur NewComponent auf der gleichen Seite laden möchte, alle zu überschreiben andere Komponenten ohne reaktiven Router zu verwenden? –

2

hier ein CodePen es in Aktion zu zeigen.

HTML

<div id="root">loading...</div> 

JSX

class NewComponent extends React.Component { 
    render() { 
    return (
     <div {...this.props}> 
     new component 
     </div> 
    ); 
    } 
} 

class Button extends React.Component { 
    render() { 
    return (
     <button {...this.props}> 
     click 
     </button> 
    ); 
    } 
} 

class App extends React.Component { 
    constructor() { 
    super(); 

    this.state = { 
     clicked: false 
    }; 

    this.handleClick = this.handleClick.bind(this); 
    } 

    handleClick() { 
    this.setState({ 
     clicked: true 
    }); 
    } 

    render() { 
    return (
     <div> 
     <Button onClick={this.handleClick} /> 
     {this.state.clicked ? <NewComponent /> : null} 
     </div> 
    ); 
    } 
}; 

React.render(
    <App />, 
    document.getElementById("root") 
); 
+0

Ein Stift hat nie so viel geholfen. Ich beginne, das bedingte Rendering-Problem über React zu bekommen :) Danke! –

Verwandte Themen