我试图让数组更新,以过滤列从它。这个想法是使用多个额外的选择/TextFields一旦我得到一个工作。我正在努力的是在哪里以及如何添加它,以便可以获得一个值来更新下面的数组。
模态/过滤器显示
function DisplayFilter(data){
const [open, setOpen] = React.useState(false);
const handleOpen = () => setOpen(true);
const handleClose = () => setOpen(false);
const [source, getSource] = React.useState('');
const handleChange = (event) => {getSource(event.target.value)}
return (
<div>
<Stack spacing={2} direction="row">
<Button onClick={handleOpen} type="submit" variant="contained" size="small" style={{ height: "40px", backgroundColor: 'purple' }} className="mleft1">
Filter
<FilterListIcon style={{ fill: "white" }} />
</Button>
</Stack>
<Modal
open={open}
onClose={handleClose}
aria-labelledby="modal-modal-title"
aria-describedby="modal-modal-description"
>
<Box sx={modalFilterStyle}>
<div>
<Box sx={{ minWidth: 120, margin: 2 }}>
<FormControl fullWidth>
<InputLabel id="source-label">Source</InputLabel>
<Select
labelId="source-label"
id="source-label-select"
value={source}
label="Source"
onChange={handleChange}
>
<MenuItem key={makeUniqueKey()} value="">
Alle
</MenuItem>
{getUnique(data.data,'source')?.map(option => {
return (
<MenuItem key={makeUniqueKey()} value={option}>
{option}
</MenuItem>
);
})}
</Select>
</FormControl>
</Box>
</div>
</Box>
</Modal>
</div>);
}
搜索文本框
function SearchBar ({setSearchQuery}){
return (
<form>
<IconButton type="submit" aria-label="search">
<SearchIcon style={{ fill: "purple" }} />
</IconButton>
<TextField
id="search-bar"
onChange={(e) => {
setSearchQuery(e.target.value);
}}
variant="outlined"
placeholder="Suche..."
size="small"
/>
</form>
);
}
这里我尝试创建一些东西来返回数组,这样我就可以将select的值传递给query
const modalfilterData = (query, data, headeritem) => {
if (!query) {
return data;
} else {
return data = data.filter((item) => {
return Object.keys(item).some(key => item[headeritem].toString().toLowerCase().search(query.toLowerCase()) !== -1);
});
}
};
其余的代码,所有的东西都在一起。这就是我使用modalfilterData
的地方,这样我就可以用select的值更新tableData。我该怎么做,才能获得选择值,并可能将其放大以添加多个类似的选择元素?
...
export default function CollapsibleTable() {
...
const rows = tableData;
...
//.
//apply filter from select value using `modalfilterData`
//.
return (
<SearchBar searchQuery={searchQuery} setSearchQuery={setSearchQuery} />
<DisplayFilter data={tableData} />
);
}
示例数据:tableData
[
{
"id": 2097190,
"date": 1652965848416,
"client": 49372,
"level": 2,
"source": 3,
"status": 0
},
{
"id": 2097185,
"date": 1652965848761,
"client": 49372,
"level": 2,
"source": 3,
"status": 0
}
]
getUnique
function getUnique(array,headeritem){
const unique = [...new Set(array.map(item => item[headeritem]))]
return Array.from(unique);
}
要从CollapsibleTable
组件的DisplayFilter
组件中获得Source
选择的值,您必须提升状态就像你在SearchBar
组件中做的那样。