选中反应表中的所有复选框

时间:2019-02-16 21:04:51

标签: json reactjs checkbox jsx

大家好,我是新来的反应者,我正尝试了解如何在这个小应用程序中添加“全部切换”。

主要任务

给定一个json值,我必须在表的复选框中显示此值。我要实现“全部检查”功能后,可以帮助我检查所有复选框。

问题

我不知道如何覆盖给定的json值

代码

import React from 'react';
import {getJson} from './getJson';

class TableComponent extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        checked: false,
        rows:[],
        json: []
      }
    }

    componentDidMount() {
      this.setState((prevState) => {
        return {
          json: getJson(),
        }
      })
    }

    checkboxHandler() {

      }

    render() {
      return (
        <div>
          <table>
            <tbody>
              {this.state.json.map((obj, i) => {
                return (
                  <tr key={obj.id}>
                    {obj.items.map((data, i) => {
                        return( 
                            <td key={data.id}> 
                                <p>{data.label}</p>
                                    <input 
                                        type="checkbox" 
                                        checked={data.value}
                                        onChange={this.checkboxHandler} 
                                    />
                            </td>
                        )
                    })}
                  </tr>
                )
              })}
            </tbody>
          </table>
        </div>
      )
    }
  }

  export default TableComponent;

我已经看过这些帖子:

  1. Stackoverflow
  2. Second stackoverflow link

Json信息

[{
            "id": "123",
            "items": [
              { "id": "231", label: "first", value: false },
              { "id": "4321", label: "second", value: true },
            ]
              }
          ];

1 个答案:

答案 0 :(得分:1)

您可以map json数组中的所有对象及其items数组中的所有项目,并创建设置了value的数组和对象的副本到true

示例

function getJson() {
  return [
    {
      id: "123",
      items: [
        { id: "231", label: "first", value: false },
        { id: "4321", label: "second", value: true },
        { id: "1337", label: "third", value: false }
      ]
    }
  ];
}

class TableComponent extends React.Component {
  state = {
    checked: false,
    rows: [],
    json: getJson()
  };

  checkboxHandler() {}

  checkAll = () => {
    this.setState(prevState => {
      const json = prevState.json.map(obj => ({
        ...obj,
        items: obj.items.map(item => ({
          ...item,
          value: true
        }))
      }));

      return { json };
    });
  };

  render() {
    return (
      <div>
        <table>
          <tbody>
            {this.state.json.map((obj, i) => {
              return (
                <tr key={obj.id}>
                  {obj.items.map((data, j) => {
                    return (
                      <td key={data.id}>
                        <p>{data.label}</p>
                        <input
                          type="checkbox"
                          checked={data.value}
                          onChange={this.checkboxHandler}
                        />
                      </td>
                    );
                  })}
                </tr>
              );
            })}
          </tbody>
        </table>
        <button onClick={this.checkAll}>Check all</button>
      </div>
    );
  }
}

ReactDOM.render(<TableComponent />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

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