Я пытаюсь реализовать фильтры-флажки для таблицы Material Ui, используя перехватчики React. Моя цель - отобразить массив значений фильтра и отфильтровать данные таблицы, если объект строки соответствует любому из отфильтрованных значений.
Например, если я выбираю / проверяю 2 значения фильтра, я хочу сравнить значения фильтра с соответствующим свойством объекта строки и добавить данные строки в новый массив, если свойство соответствует одному из значений фильтра.
Ниже мой прогресс.
Table.js
// Set state using useState hook
const [filter, setFilter] = React.useState(null);
// Table data
tableData = [
{color: 'red', type:'fruit', name:'apple'},
{color: 'blue', type:'fruit', name:'blueberry'},
{color: 'green', type:'veg', name:'lettuce'},
{color: 'green', type:'veg', name:'celery'},
]
// Pull unique colors from global state
const uniqueColors = [...new Set(arr.map(item => item.color))]; // [red, blue, green]
// Handle checkbox filtering ... this is where I'm running into issues
function handleSelectFilter(option, checked) {
if(checked){
setFilter(option); // add option to filter array
let filterArr = tableData.filter(row => row.color == option);
}else{
//if unchecked, remove from filterArr and unfilter the table
let filterArr = tableData.filter(row => row.color !== option);
setFilter(filterArr);
}
}
...
return (
...
<Grid>
<FilterPopOver
options={uniqueColors}
onSelectFilter={handleSelectFilter}
/>
</Grid>
...
)
FilterPopover.js : onChange - FilterPopoverКомпонент просто отправляет handleSelectFilter()
значение, которое было изменено, и если оно было проверено или не проверено (например, (красный, true))
Требуемый вывод
filterArr=['red','green']
tableData = [
{color: 'red', type:'fruit', name:'apple'},
{color: 'green', type:'veg', name:'lettuce'},
{color: 'green', type:'veg', name:'celery'},
]