Вопрос или проблема
Мне нужно центрировать опции в автозаполнении MUI, но я пробовал много способов и все еще неудачно. Также мне нужно обернуть каждую опцию в рамку. Я пытался добавить это в inputProps и в стиль компонента paper, но это не сработало. Вот мой код на данный момент:
const PlacementCell = ({ value, placements, notAvailable = false, readOnly = false }: PlacementCellProps): ReactElement => {
const { palette, spacing } = useTheme();
const [selectedPlacement, setSelectedPlacement] = useState<Placement | undefined>(value || placements[0]);
const handlePlacementChange = (event: React.SyntheticEvent, newValue: Placement | null) => {
if (newValue !== null) {
setSelectedPlacement(newValue);
}
};
const CustomListbox = styled('ul')({
[`& .${autocompleteClasses.option}`]: {
display: 'flex',
justifyContent: 'center',
},
});
return (
<Stack
direction="row"
height={1}
alignItems="center"
spacing={2}
justifyContent="space-between"
>
<Autocomplete
options={placements}
getOptionLabel={(option) => option.placementName}
renderInput={(params) => (
<TextField
placeholder="Выбрать"
{...params}
InputProps={{
...params.InputProps,
disableUnderline: true,
}}
inputProps={{
...params.inputProps,
style: { textAlign: 'center' },
}}
sx={{
[`& .${autocompleteClasses.inputRoot} .MuiInput-input`]: {
padding: '12px',
},
variant: 'bodySmall.default',
[`& .${autocompleteClasses.popupIndicator}`]: {
right: 12,
['&:hover']: {
backgroundColor: 'transparent',
},
},
}}
/>
)}
// PaperComponent={CustomPaper}
fullWidth
disableClearable
onChange={handlePlacementChange}
/>
</Stack>
);
};
Вот изображение того, что я должен отображать
Спасибо за любые предложения!
Ответ или решение
Для того чтобы центрировать элементы в выпадающем списке компонента Autocomplete от Material-UI (MUI) и обернуть каждый элемент в рамку, необходимо внести несколько изменений в ваш код. Я предлагаю вам следующее решение:
- Создать кастомный компонент Paper: Этот компонент будет содержать стили для обертки элементов списка.
- Использовать кастомный компонент для опций: При помощи
renderOption
, в котором вы сможете определить стиль для каждой опции, включая центрирование и рамку.
Вот как должен выглядеть ваш обновленный код:
import React, { useState, ReactElement } from 'react';
import { Autocomplete } from '@mui/material';
import { TextField, Stack, Paper } from '@mui/material';
import { styled } from '@mui/material/styles';
import { autocompleteClasses } from '@mui/material/Autocomplete';
const CustomPaper = styled(Paper)({
border: '1px solid #ccc', // Укажите желаемый стиль рамки
});
const CustomOption = styled('li')(({ theme }) => ({
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
padding: theme.spacing(1),
border: '1px solid #ccc', // Указываем стиль рамки для каждой опции
margin: theme.spacing(0.5, 0),
borderRadius: 4,
'&:hover': {
backgroundColor: theme.palette.action.hover,
},
}));
const PlacementCell = ({ value, placements, notAvailable = false, readOnly = false }) => {
const [selectedPlacement, setSelectedPlacement] = useState(value || placements[0]);
const handlePlacementChange = (event, newValue) => {
if (newValue !== null) {
setSelectedPlacement(newValue);
}
};
return (
<Stack direction="row" height={1} alignItems="center" spacing={2} justifyContent="space-between">
<Autocomplete
options={placements}
getOptionLabel={(option) => option.placementName}
renderInput={(params) => (
<TextField
placeholder="Select"
{...params}
InputProps={{
...params.InputProps,
disableUnderline: true,
}}
inputProps={{
...params.inputProps,
style: { textAlign: 'center' },
}}
sx={{
[`& .${autocompleteClasses.inputRoot} .MuiInput-input`]: {
padding: '12px',
},
variant: 'bodySmall.default',
}}
/>
)}
renderOption={(props, option) => (
<CustomOption {...props}>
{option.placementName}
</CustomOption>
)}
PaperComponent={CustomPaper}
fullWidth
disableClearable
onChange={handlePlacementChange}
/>
</Stack>
);
};
export default PlacementCell;
Объяснение изменений:
- CustomPaper: Добавлен кастомный компонент Paper для задания стилей обертки.
- CustomOption: Создан кастомный компонент опции, который центрирует текст, добавляет отступы и рамку.
- renderOption: Использован для рендеринга каждой опции с помощью вашего кастомного компонента.
Теперь ваши элементы будут иметь правильно центрированный текст и обрамление. Не забудьте заменить border
на нужный вам стиль рамки, если необходимо.
Надеюсь, это поможет решить вашу задачу!