12

I am new to react. How to render a component only after clicking a button in react?

Here in my case on clicking a button I have to display a table which displays the data from the database.

I have attached my code below for your reference, the first component is the button component and below that you can find the components for the table.

Also I would like to know how to refresh a component on clicking a button without refreshing the entire page.

var Button = React.createClass({
render: function () {
        return (
           <button type="button">Display</button>

            ); }
});

var EmployeeRow = React.createClass({

    render: function () {
        return (
            <tr>
                  <td>{this.props.item.EmployeeID}</td>
                  <td>{this.props.item.FirstName}</td>
                  <td>{this.props.item.LastName}</td>
                  <td>{this.props.item.Gender}</td>                                                   
              </tr>

            );
    }
});

  var EmployeeTable = React.createClass({

      getInitialState: function(){

          return{
              result:[]
          }
      },
      componentWillMount: function(){

          var xhr = new XMLHttpRequest();
          xhr.open('get', this.props.url, true);
          xhr.onload = function () {
              var response = JSON.parse(xhr.responseText);

              this.setState({ result: response });

          }.bind(this);
          xhr.send();
      },
      render: function(){
          var rows = [];
          this.state.result.forEach(function (item) {
              rows.push(<EmployeeRow key={item.EmployeeID} item={item} />);
          });
          return (
<Button />
  <table className="table">
     <thead>
         <tr>
            <th>EmployeeID</th>
            <th>FirstName</th>
            <th>LastName</th>
            <th>Gender</th>               
         </tr>
     </thead>
      <tbody>
          {rows}
      </tbody>
  </table>

  );
  } });

  ReactDOM.render(<EmployeeTable url="api/Employee/GetEmployeeList" />,
          document.getElementById('grid'))   
Praveen Mohan
  • 211
  • 1
  • 6
  • 16
  • For reloading https://stackoverflow.com/questions/30626030/can-you-force-a-react-component-to-rerender-without-calling-setstate – Vipin Kumar Nov 21 '17 at 06:58
  • Asked a thousand times. See: https://reactjs.org/docs/conditional-rendering.html – Ian Jul 08 '19 at 00:54

2 Answers2

29

I've set up a sandbox to showcase how you can do this.

In essence:

  1. Initialise state with a boolean set to false
  2. Render the component conditionally based on this boolean; so initially the component will now show up on the DOM
  3. On some action (onClick), setState on the boolean to true
  4. The component will re-render since the state changed and will now show the hidden component (since the boolean has been set to true)
Raghudevan Shankar
  • 1,083
  • 9
  • 18
4

You can do something like this.

First Initialize the state with a property show with false when the component mounts.

componentDidMount() {
  this.state = {
    show: false
  };
}

Add a function to change the state. (You can use this function to toggle state as well)

showTable() {
  this.setState({
    show: true
  });
}

Call the function on click of the button.

<button onclick="showTable()">
  Show Table
</button>

Add your table inside braces along with the expression like this.

{
  this.state.show &&
  <table className="table">
     <thead>
         <tr>
            <th>EmployeeID</th>
            <th>FirstName</th>
            <th>LastName</th>
            <th>Gender</th>               
         </tr>
     </thead>
      <tbody>
          {rows}
      </tbody>
  </table>
}

Hope this helps!

Edison D'souza
  • 4,551
  • 5
  • 28
  • 39