[英]How to implement search in material-ui datagrid?
我正在嘗試在 Material-UI 數據網格中實現快速過濾/搜索選項。 截至目前,datagrid 沒有搜索選項。 我正在使用Material-UI-Search-Bar庫來添加搜索字段和功能。 我在自定義工具欄中有這個,但不幸的是這不起作用,因為它與 state 有關。我無法聚焦文本字段。 在我的代碼下面
...
const requestSearch = (searchedVal: string) => {
const filteredRows = tableData.filter((o: any) => {
return Object.keys(o).some((k: any) => {
return o[k].toString().toLowerCase().indexOf(searchedVal.toLowerCase()) != -1;
})
});
console.log(filteredRows);
// setTableData(filteredRows);
};
const cancelSearch = () => {
setSearchText("");
requestSearch(searchText);
};
const CustomToolbar = () => {
<div className='p-6'>
<div> ... </div>
<SearchBar
value={searchText}
onChange={(searchVal: string) => requestSearch(searchVal)}
onCancelSearch={() => cancelSearch()}
/>
</div>
}
...
return (
<div ... >
<div style={{ height: 500, width: '100%', backgroundColor: 'white' }}>
<DataGrid
rows={tableData}
columns={columns}
components={{ Toolbar: CustomToolbar }}
...
/>
</div>
</div>
)
在MUI數據網格中,快速搜索在文檔中不是很突出,但他們在運行演示示例中添加了。 您只需將此道具添加到數據網格即可完成。 即使你可以在這里設置去抖動時間。
componentsProps={{
toolbar: {
showQuickFilter: true,
quickFilterProps: { debounceMs: 500 },
},
}}
有時 Material-UI-Search-Bar 庫會中斷,所以最好使用這個:
import * as React from 'react';
import IconButton from '@mui/material/IconButton';
import TextField from '@mui/material/TextField';
import {
DataGrid,
GridToolbarDensitySelector,
GridToolbarFilterButton,
} from '@mui/x-data-grid';
import { useDemoData } from '@mui/x-data-grid-generator';
import ClearIcon from '@mui/icons-material/Clear';
import SearchIcon from '@mui/icons-material/Search';
import { createTheme } from '@mui/material/styles';
import { createStyles, makeStyles } from '@mui/styles';
function escapeRegExp(value: string): string {
return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}
const defaultTheme = createTheme();
const useStyles = makeStyles(
(theme) =>
createStyles({
root: {
padding: theme.spacing(0.5, 0.5, 0),
justifyContent: 'space-between',
display: 'flex',
alignItems: 'flex-start',
flexWrap: 'wrap',
},
textField: {
[theme.breakpoints.down('xs')]: {
width: '100%',
},
margin: theme.spacing(1, 0.5, 1.5),
'& .MuiSvgIcon-root': {
marginRight: theme.spacing(0.5),
},
'& .MuiInput-underline:before': {
borderBottom: `1px solid ${theme.palette.divider}`,
},
},
}),
{ defaultTheme },
);
interface QuickSearchToolbarProps {
clearSearch: () => void;
onChange: () => void;
value: string;
}
function QuickSearchToolbar(props: QuickSearchToolbarProps) {
const classes = useStyles();
return (
<div className={classes.root}>
<div>
<GridToolbarFilterButton />
<GridToolbarDensitySelector />
</div>
<TextField
variant="standard"
value={props.value}
onChange={props.onChange}
placeholder="Search…"
className={classes.textField}
InputProps={{
startAdornment: <SearchIcon fontSize="small" />,
endAdornment: (
<IconButton
title="Clear"
aria-label="Clear"
size="small"
style={{ visibility: props.value ? 'visible' : 'hidden' }}
onClick={props.clearSearch}
>
<ClearIcon fontSize="small" />
</IconButton>
),
}}
/>
</div>
);
}
export default function QuickFilteringGrid() {
const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 100,
maxColumns: 6,
});
const [searchText, setSearchText] = React.useState('');
const [rows, setRows] = React.useState<any[]>(data.rows);
const requestSearch = (searchValue: string) => {
setSearchText(searchValue);
const searchRegex = new RegExp(escapeRegExp(searchValue), 'i');
const filteredRows = data.rows.filter((row: any) => {
return Object.keys(row).some((field: any) => {
return searchRegex.test(row[field].toString());
});
});
setRows(filteredRows);
};
React.useEffect(() => {
setRows(data.rows);
}, [data.rows]);
return (
<div style={{ height: 400, width: '100%' }}>
<DataGrid
components={{ Toolbar: QuickSearchToolbar }}
rows={rows}
columns={data.columns}
componentsProps={{
toolbar: {
value: searchText,
onChange: (event: React.ChangeEvent<HTMLInputElement>) =>
requestSearch(event.target.value),
clearSearch: () => requestSearch(''),
},
}}
/>
</div>
);
}
如果demo不夠,需要實現原生版本,請到# 2842點贊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.