Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onClick doesn't render new react component.

I'm new to react world and I have line like this:

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

and on click you will get hello printed on the console. Now change the line to:

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

now on click on the button, I expect the NewComponent to be rendered. But it doesn't.

I'm not sure, why that is the case. Note that I have the above code in the render method.

like image 783
batman Avatar asked Nov 21 '15 05:11

batman


People also ask

How do you call a component onClick in React?

The React onClick event handler enables you to call a function and trigger an action when a user clicks an element, such as a button, in your app. Event names are written in camelCase, so the onclick event is written as onClick in a React app. In addition, React event handlers appear inside curly braces.


2 Answers

You probably want to have a stateful component that shows the other component next to the button after it was clicked. All you need to do is track whether the button was clicked:

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>     );   } } 
like image 140
Felix Kling Avatar answered Sep 21 '22 02:09

Felix Kling


Here's a CodePen to show it in action.

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") ); 
like image 34
Brian Swisher Avatar answered Sep 21 '22 02:09

Brian Swisher