Флажок Пользовательской таблицы с параметром «Выбрать все» Реагирует

#javascript #jquery #reactjs #react-redux #react-hooks

Вопрос:

Я пытаюсь добавить a checkbox в пользовательскую таблицу с помощью этой select All функции.

Проблема:- Когда я нажимаю на select all флажок, он работает нормально, но если я нажимаю на любую строку checkbox , он перестает работать должным образом.

Код:- TableWrapper.Js

 import React, { useCallback, useEffect, useState, useRef } from "react";

import TableBody from "./TableBody";
import TableHead from "./TableHead";

const TableWrapper = ({headers, isCheckBox, tableData, checkedBoxSlectedData}) => {

  const columns = createHeaders(headers);

  const [ checkedData, setCheckedData ] = useState([])
  const [ selectAll, setSelectAll ] = useState('unchecked')
  const [ checkHeaderState, setCheckHeaderState ] = useState('unchecked')

  useEffect(() => {
    const visibleData = tableData.data.firstResponse.slice(0, numToDisplay);
    setVisibleData(visibleData);
  },[numToDisplay])

  useEffect(() => {
    getSelectState(checkedData.length, tableData.data.firstResponse.length); 
    checkedBoxSlectedData(checkedData)
  },[checkedData])
 
  const getSelectState = (checkDataLength, dataLength) => {
    switch (true) {
      case checkDataLength === dataLength:
          setCheckHeaderState('checked');
          break;
      case checkDataLength === 0:
          setCheckHeaderState('unchecked');
          break;
    }
  }

  const selectAllChecked = () => {
    {selectAll === 'checked' ? setSelectAll('unchecked'): setSelectAll('checked')}
  }

  const selectedCheckBox = (event, rowClicked) => {
    setCheckedData(
      prev => event
        ? [...prev, rowClicked]
        : prev.filter(val => val.id !== rowClicked.id)
    );
  }

  return (
    <>
    <div className="container">
    <div className="table-wrapper">
    <table>
      <TableHead 
        headers={columns}
        isCheckBox={isCheckBox}
        checkHeaderState={checkHeaderState}
        isSelectAll={selectAll} 
        selectAllChecked={selectAllChecked} 
      />
      <TableBody 
        headers={columns} 
        isCheckBox={isCheckBox} 
        isCheckBoxChecked={selectedCheckBox} 
        isSelectAll={selectAll} 
        tableData={visibleData}
      />
    </table>
    </div>
    </div>
    </>
  );
};

export default TableWrapper;
 

TableHead.js

 import React, { useEffect, useRef, useState } from "react";

const TableHead = ({ checkHeaderState, headers, isCheckBox, selectAllChecked }) => {

  const checkRef = useRef();

  useEffect(()=>{
    if(checkRef.current !== null amp;amp; checkRef.current !== undefined) {
       if(checkHeaderState === 'checked') {
        checkRef.current.checked = true;
        checkRef.current.indeterminate = false;
      } else if(checkHeaderState === 'unchecked') {
        checkRef.current.checked = false;
        checkRef.current.indeterminate = false;
      }
    }
  },[checkHeaderState])


  return (
    <thead>
        <tr>
          {
            isCheckBox amp;amp; 
              <th key={`table-header-checkBox`}><input id="select-all-checkBox" type="checkbox" onClick={selectAllChecked} ref={checkRef} /></th>
          }
        {headers.map((item, i) => {
          const { field, header, style} = item
          return (
            <th
              style={style}>
              {header}
            </th>
          )})}
        </tr>
    </thead>
  );
};

export default TableHead;
 

TableBody.js

 import React, { useEffect, useState } from "react";

import TableRow from "./TableRow";

const TableBody = ({ headers, isCheckBox, isSelectAll, isCheckBoxChecked, tableData }) => {

  const [columnHeaderKeys, setColumnHeaderKeys] = useState([]);

  useEffect(()=>{
    let keysArray = [];
    headers.map(({field}) => keysArray.push(field));
    keysArray.length !== 0 ? setColumnHeaderKeys(keysArray) : setColumnHeaderKeys([]);
  },[tableData])

  return (
    <tbody>
    {tableData.length !== 0 ?
      tableData.map((row, index)=>{
        return (<tr key={index}><TableRow key={index} isCheckBox={isCheckBox} data={row} keys={columnHeaderKeys} isSelectAll={isSelectAll} isCheckBoxChecked={isCheckBoxChecked} /></tr>)
      }) : <div>{"No Data is there"}</div>
    }
    </tbody>
  );
};

export default TableBody;
 

TableRow.js

 import React from "react";

const TableRow = ({ data, isCheckBox, isCheckBoxChecked, isSelectAll, keys }) => {
  
  return (
    <>
    {
        isCheckBox amp;amp; 
            <td><input 
                type="checkbox" 
                checked={isSelectAll === 'checked' ? 'checked' : null} 
                onChange={(event)=> isCheckBoxChecked(event.target.checked, data)}/>
            </td>
    }
    {keys.map((key)=>{
        return(
            <>
               <td key={data[key]}>{data[key]}</td>
            </>
        )
    })}
    </>
  );
};

export default TableRow;
 

Not sure where I am missing the catch, I tried few things in this. Still, I was not able to figure out the catch.

Please suggest me the way to do or any other better way to achieve the same feature.