【问题标题】:Select all checkboxes / rows - React hooks app选择所有复选框/行 - React hooks 应用程序
【发布时间】:2021-02-03 15:55:31
【问题描述】:

我正在努力一次检查表格中的所有复选框。 我可以检查单个复选框,但我也希望选择检查 一个“主复选框”,它会检查所有其他复选框。

我创建了我的 React 组件的简化版本: https://codesandbox.io/s/lively-wildflower-fknn9

我正在努力解决两件事。

  1. 如果我们删除两个复选框的选中属性,我们可以手动检查每个复选框并将其打印到控制台。如果我们通过将checked 参数设置为checked={checkAll} 来覆盖它,我们可以单击All 复选框,并且复选框1 和2 都被选中。但是,它不会调用复选框的onChange 属性,这意味着我无法记录检查。

  2. 如果我设置checked={checkAll} 属性,我基本上会覆盖复选框,这意味着复选框图标本身不会从选中变为未选中。然而,onChange 属性被调用,我能够将更改记录到控制台。

我想单独选中两个复选框,并使用“主复选框”来选中两个复选框,并同时调用它们的onChange

我该怎么做呢? 任何建议都会非常有帮助

【问题讨论】:

  • 操作方法如下:codesandbox.io/s/serene-jackson-h6c4p?file=/src/App.js 关键是不要覆盖任何内容,而是在 all 复选框更改时简单地更改所有复选框的状态。
  • 嗨。感谢您抽出宝贵时间。我能够采用您示例中的一些原则并使我的应用程序按预期工作。我使用一种状态来处理实际选定的项目。我的 UI 也有不同的状态(单击、全选、取消选择等等。)一旦我让两者同时并行工作,我就解决了我的问题。谢谢。您可以创建某种形式的我可以接受的一般性答案。

标签: javascript reactjs react-hooks


【解决方案1】:

这是一种处理方式:

CodeSandbox link

这是最终的行为:

import React, { useState, useEffect } from "react";
import "./styles.css";

export default function App() {
  const [checkedAll, setCheckedAll] = useState(false);
  const [checked, setChecked] = useState({
    nr1: false,
    nr2: false
  });

  /* ################################################ */
  /* #### TOGGLES checK STATE BASED ON inputName #### */
  /* ################################################ */

  const toggleCheck = (inputName) => {
    setChecked((prevState) => {
      const newState = { ...prevState };
      newState[inputName] = !prevState[inputName];
      return newState;
    });
  };

  /* ###################################################### */
  /* #### CHECKS OR UNCHECKS ALL FROM SELECT ALL CLICK #### */
  /* ###################################################### */

  const selectAll = (value) => {
    setCheckedAll(value);
    setChecked((prevState) => {
      const newState = { ...prevState };
      for (const inputName in newState) {
        newState[inputName] = value;
      }
      return newState;
    });
  };

  /* ############################################# */
  /* #### EFFECT TO CONTROL CHECKED_ALL STATE #### */
  /* ############################################# */

  // IF YOU CHECK BOTH INDIVIDUALLY. IT WILL ACTIVATE THE checkedAll STATE
  // IF YOU UNCHECK ANY INDIVIDUALLY. IT WILL DE-ACTIVATE THE checkAll STATE

  useEffect(() => {
    let allChecked = true;
    for (const inputName in checked) {
      if (checked[inputName] === false) {
        allChecked = false;
      }
    }
    if (allChecked) {
      setCheckedAll(true);
    } else {
      setCheckedAll(false);
    }
  }, [checked]);

  /* ########################## */
  /* #### RETURN STATEMENT #### */
  /* ########################## */

  return (
    <div className="App">
      <div>
        <label>All</label>
        <input
          type="checkbox"
          onChange={(event) => selectAll(event.target.checked)}
          checked={checkedAll}
        />
      </div>
      <div>
        <label>1</label>
        <input
          type="checkbox"
          name="nr1"
          onChange={() => toggleCheck("nr1")}
          checked={checked["nr1"]}
        />
      </div>
      <div>
        <label>2</label>
        <input
          type="checkbox"
          name="nr2"
          onChange={() => toggleCheck("nr2")}
          checked={checked["nr2"]}
        />
      </div>
    </div>
  );
}

【讨论】:

  • 这很好,也很简单,但是当您使用带有“地图”的复选框数组时,如何设置一个检查所有?
猜你喜欢
  • 2021-10-06
  • 2019-05-20
  • 1970-01-01
  • 2021-04-28
  • 2019-10-31
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多