2015-11-21 29 views
17

Sono nuovo di reagire mondo e ho riga come questa:onClick non esegue il rendering di nuovo componente di reazione.

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

e cliccare otterrete hello stampata sulla console. Ora cambiare la linea a:

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

ora in poi fare clic sul pulsante, mi aspetto che il NewComponent da rendere. Ma non è così.

Non sono sicuro, perché è così. Si noti che ho il codice sopra nel metodo render.

+0

che non è solo come funziona. Dove ti aspetteresti che il componente esegua il rendering? –

+0

sulla stessa pagina. – batman

+0

Ma dove? Sopra il bottone? Sotto il pulsante? All'interno del pulsante? * All'interno dell'attributo 'onClick'? * Da qualche altra parte? Attualmente il tuo gestore di clic è qualcosa come 'function() {React.createElement (...); } '. Non fa nulla con l'elemento che è stato creato. –

risposta

31

Probabilmente si desidera avere un componente stateful che mostri l'altro componente accanto al pulsante dopo che è stato fatto clic. Tutto quello che dovete fare è traccia se il pulsante è stato cliccato:

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

Ciao. Cosa succede se voglio caricare solo NewComponent nella stessa pagina sovrascrivendo tutte le altri componenti senza utilizzare il router di reazione? –

2

Ecco un CodePen per mostrare in azione.

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

Una penna non ha mai aiutato così tanto. Sto iniziando a ottenere il problema del rendering condizionale su React :) grazie! –

Problemi correlati