如何在 react-virtuaized Table 行中 select 复选框?
How to select checkboxes in row in react-virtuaized Table?
我已经使用 react-virtualized Table 组件实现了 Table。我在 table 中添加了一个复选框列,现在想使用这些复选框实现 select all/select 行功能。
现在,为了添加 select all/select 行功能,我正在使用反应钩子来更改 CheckBox
的 checked
道具,但它似乎不起作用.下面是代码 link,当我用实际数据向下滚动页面时,复选框选中状态被删除。
这是我正在尝试执行的代码,checked
对于除 header 之外的行始终保持为 false。 Header select 一切正常
...
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}
/>
)}
/>
...
- 滚动 table 后如何维护检查?
- 我在检查单个行时哪里做错了?
如有任何帮助,我们将不胜感激!
同时,在等待答案的过程中,我花了更多时间,发现我正在变异 checked
而没有使用 useState
hook。
这是更新后的代码:
.....
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}
/>
)}
/>
....
这是使用虚拟数据的工作预览:
我已经使用 react-virtualized Table 组件实现了 Table。我在 table 中添加了一个复选框列,现在想使用这些复选框实现 select all/select 行功能。
现在,为了添加 select all/select 行功能,我正在使用反应钩子来更改 CheckBox
的 checked
道具,但它似乎不起作用.下面是代码 link,当我用实际数据向下滚动页面时,复选框选中状态被删除。
这是我正在尝试执行的代码,checked
对于除 header 之外的行始终保持为 false。 Header select 一切正常
...
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}
/>
)}
/>
...
- 滚动 table 后如何维护检查?
- 我在检查单个行时哪里做错了?
如有任何帮助,我们将不胜感激!
同时,在等待答案的过程中,我花了更多时间,发现我正在变异 checked
而没有使用 useState
hook。
这是更新后的代码:
.....
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}
/>
)}
/>
....
这是使用虚拟数据的工作预览: