Как установить флажки в строке в Реактивно-виртуализированной таблице? - PullRequest
0 голосов
/ 28 апреля 2020

Я реализовал таблицу, используя компонент реагирующей виртуализации таблицы. Я добавил столбец флажка в таблицу и теперь хочу реализовать функцию выбора всех / выбора строки, используя эти флажки.

Теперь, для добавления функции выбора всех / выбора строки, я использую реагирующие хуки для изменения checked опора CheckBox но, похоже, не работает. Ниже приведена ссылка на код, и когда я прокручиваю страницу вниз с фактическими данными, флажок проверяется, состояние снято.

Вот код, который я пытаюсь сделать, checked всегда остается ложным для строк, кроме заголовок Заголовок select all работает нормально

...
import {Checkbox} from 'semantic-ui-react';
const[selectAll, setSelectAll] = useState(false):
const checked = [];
function _checkboxState(data) {
    if (checked.includes(data.index)) {
      checked.pop(data.index);
    } else {
      checked.push(data.index);
    }
  }
<Column
    disableSort
    dataKey="checkbox"
    width={30}
    headerRenderer={() => (
      <Checkbox
        checked={selectAll}
        onChange={() => {
          if (selectAll === true) {
            setSelectAll(false);
          } else {
            setSelectAll(true);
          }
        }}
      />
    )}
    cellRenderer={({rowIndex}) => (
      <Checkbox
        checked={selectAll || checked.includes(rowIndex)}
        onChange={(e, data) => {
          _checkboxState(data);
        }}
        index={rowIndex}
      />
    )}
/>
...
  1. Как сохранить проверки даже после прокрутки таблицы?
  2. Где я делаю неправильно для проверки отдельных строк?

Любая помощь по этому вопросу приветствуется!

1 Ответ

0 голосов
/ 30 апреля 2020

Тем временем, пока я ждал ответа, я потратил больше времени и обнаружил, что я мутировал checked и не использовал useState крючок.

Это обновленный код:

.....
const [checked, setChecked] = useState([]);

const _onChangeHeaderCheckbox = data => {
    data.checked ? setChecked(sortedList.map(row => row.id)) : setChecked([]);
  };

const _onChangeRowCheckbox = data => {
    const newRow = sortedList[data.index].id;
    checked.includes(newRow)
      ? setChecked(old => old.filter(row => row !== newRow))
      : setChecked(old => [...old, newRow]);
  };

....
<Column
  disableSort
  dataKey="checkbox"
  width={30}
  headerRenderer={() => (
    <Checkbox
      indeterminate={
        checked.length > 0 && checked.length < sortedList.length
      }
      checked={checked.length === sortedList.length}
      onChange={(e, data) => _onChangeHeaderCheckbox(data)}
    />
  )}
  cellRenderer={({ rowIndex }) => (
    <Checkbox
      checked={checked.includes(sortedList[rowIndex].id) === true}
      onChange={(e, data) => _onChangeRowCheckbox(data)}
      index={rowIndex}
    />
  )}
/>
....

Вот рабочий предварительный просмотр с фиктивными данными:

Edit react-virtualized table checbox stackoverflow

...