Как реализовать кастомные алгоритмы в компонентах Material UI
Что проверяют
Формулировка расплывчатая, и первым делом интервьюер смотрит, уточните ли вы, о чём речь: о своей логике фильтрации, сортировки и рендера внутри компонентов или о стилизации. Хороший ответ разводит эти два слоя и показывает, что вы знаете точки расширения Material UI, а не оборачиваете Button ради console.log. Следом часто спрашивают про производительность на больших списках.
Как отвечать
Покажите, что у библиотеки есть штатные места для своей логики:
- Autocomplete:
filterOptionsпринимает свою функцию фильтрации,createFilterOptionsнастраивает встроенную (matchFrom: 'start',stringify,limit). Для поиска на сервере передаютfilterOptions={(x) => x}, чтобы компонент не фильтровал повторно. РядомgetOptionLabel,isOptionEqualToValue,renderOption; - DataGrid из MUI X: в описании колонки задаются
sortComparatorдля своей сортировки,valueGetterдля вычисляемых значений,filterOperatorsдля своих условий фильтра,renderCellдля отображения. Для больших данных сортировку и фильтрацию уносят на сервер черезsortingMode="server"иfilterMode="server"; - безголовые хуки:
useAutocompleteотдаёт логику без разметки, если вид нужен полностью свой; - слоты:
slotsиslotPropsподменяют внутренние части компонента без форка.
Сама логика живёт в чистых функциях или кастомном хуке, а компонент MUI только получает её через пропсы. Такие функции тестируются отдельно, без рендера. Тяжёлые вычисления оборачивают в useMemo.
Стили в современной версии задаются через sx, styled() из @mui/material/styles и переопределения в теме: components.MuiButton.styleOverrides и defaultProps.
Где спотыкаются
Приносят makeStyles из @material-ui/core. Это API четвёртой версии, в пятой его вынесли в устаревший пакет @mui/styles на JSS, и в новом коде это сигнал устаревшего опыта.
Фильтруют опции снаружи и оставляют встроенную фильтрацию: Autocomplete отсеивает уже отфильтрованное, и часть подходящих вариантов пропадает.
Под «кастомным алгоритмом» показывают обработчик клика с логированием. Интервьюер ждал разговора про компаратор, фильтр или виртуализацию.