How to add and remove table rows Dynamically in React.js

前端 未结 2 1688
甜味超标
甜味超标 2020-12-15 14:51
 my attempt fiddle here ..........

https://jsfiddle.net/techboy0007/j1eas924/

https://i.stack.imgur.com/KXFot.png

相关标签:
2条回答
  • 2020-12-15 15:31

    You can achieve that by playing with react state. In your case you are using nested objects so you need to be carefully when you update them.

    It's not a good idea to mutate your state because it can cause easily bugs or an unexpected behavior.

    Look closely how the handling functions are working.

    Here you have a live demo.

    class App extends React.Component {
      state = {
        rows: []
      };
      handleChange = idx => e => {
        const { name, value } = e.target;
        const rows = [...this.state.rows];
        rows[idx] = {
          [name]: value
        };
        this.setState({
          rows
        });
      };
      handleAddRow = () => {
        const item = {
          name: "",
          mobile: ""
        };
        this.setState({
          rows: [...this.state.rows, item]
        });
      };
      handleRemoveRow = () => {
        this.setState({
          rows: this.state.rows.slice(0, -1)
        });
      };
      render() {
        return (
          <div>
            <div className="container">
              <div className="row clearfix">
                <div className="col-md-12 column">
                  <table
                    className="table table-bordered table-hover"
                    id="tab_logic"
                  >
                    <thead>
                      <tr>
                        <th className="text-center"> # </th>
                        <th className="text-center"> Name </th>
                        <th className="text-center"> Mobile </th>
                      </tr>
                    </thead>
                    <tbody>
                      {this.state.rows.map((item, idx) => (
                        <tr id="addr0" key={idx}>
                          <td>{idx}</td>
                          <td>
                            <input
                              type="text"
                              name="name"
                              value={this.state.rows[idx].name}
                              onChange={this.handleChange(idx)}
                              className="form-control"
                            />
                          </td>
                          <td>
                            <input
                              type="text"
                              name="mobile"
                              value={this.state.rows[idx].mobile}
                              onChange={this.handleChange(idx)}
                              className="form-control"
                            />
                          </td>
                        </tr>
                      ))}
                    </tbody>
                  </table>
                  <button
                    onClick={this.handleAddRow}
                    className="btn btn-default pull-left"
                  >
                    Add Row
                  </button>
                  <button
                    onClick={this.handleRemoveRow}
                    className="pull-right btn btn-default"
                  >
                    Delete Row
                  </button>
                </div>
              </div>
            </div>
          </div>
        );
      }
    }
    
    render(<App />, document.getElementById("root"));
    

    PD: If I can give you a recommendation I'd say that you need to study a little bit more about react - javascript to move forward because it would helpful to achieve things like this faster, right now you need to understand the basics pretty good.

    0 讨论(0)
  • 2020-12-15 15:44

    If you want to add/remove rows dynamically you can play with the state, or if you where using Redux you can play with the store.

    Here's a simple example using a components local state to add and remove rows:

    https://codesandbox.io/s/k302jwn44r

    EDIT: fixed mutating state

    import React from "react";
    import { render } from "react-dom";
    
    const styles = {
      fontFamily: "sans-serif",
      textAlign: "left"
    };
    
    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          rows: []
        };
      }
    
      handleAddRow = () => {
        this.setState((prevState, props) => {
          const row = {content: "hello this is a new row!" };
          return { rows: [...prevState.rows, row] };
        });
      };
    
      handleRemoveRow = () => {
        this.setState((prevState, props) => {
          return { rows: prevState.rows.slice(1) };
        });
      };
    
      render() {
        console.log(this.state);
        return (
          <div style={styles}>
            <table>
              <tbody>
                {this.state.rows.map(row => (
                  <tr>
                    <td>{row.content}</td>
                  </tr>
                ))}
                <tr>
                  <td className="" onClick={this.handleAddRow}>
                    (+)
                  </td>
                  {Boolean(this.state.rows.length) && (
                    <td onClick={this.handleRemoveRow}>(-)</td>
                  )}
                </tr>
              </tbody>
            </table>
          </div>
        );
      }
    }
    
    render(<App />, document.getElementById("root"));
    
    0 讨论(0)
提交回复
热议问题