Проблема с отображением Modal
из Autocomplete
заключается в том, что события распространяются от Modal
до Autocomplete
. В частности, события click и mouse-down обрабатываются Autocomplete
таким образом, что вызывает проблемы в вашем случае. Это в первую очередь логика c, предназначенная для удержания фокуса в нужном месте при взаимодействии с различными частями Autocomplete
.
Ниже (от https://github.com/mui-org/material-ui/blob/v4.9.11/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js#L842) находится часть код Autocomplete
, который вам мешает:
// Prevent input blur when interacting with the combobox
const handleMouseDown = (event) => {
if (event.target.getAttribute('id') !== id) {
event.preventDefault();
}
};
// Focus the input when interacting with the combobox
const handleClick = () => {
inputRef.current.focus();
if (
selectOnFocus &&
firstFocus.current &&
inputRef.current.selectionEnd - inputRef.current.selectionStart === 0
) {
inputRef.current.select();
}
firstFocus.current = false;
};
Поведение браузера по умолчанию при возникновении события нажатия мыши на фокусируемом элементе заключается в том, что этот элемент получает фокус, а обработчик нажатия мыши для Autocomplete
вызывает event.preventDefault()
, что предотвращает это поведение по умолчанию и, таким образом, предотвращает изменение фокуса от события нажатия мыши (таким образом, фокус остается на самом Modal
, как указано его синей рамкой фокуса). Однако вы можете успешно переместить фокус на TextField модала с помощью клавиши табуляции, поскольку ничто не мешает этому механизму изменения фокуса.
Обработчик щелчков Autocomplete
сохраняет фокус на вводе Autocomplete
, даже если Вы нажимаете на другую часть Autocomplete
. Когда ваш Modal
открыт, эффект этого состоит в том, что когда вы щелкаете в Modal
, фокус ненадолго перемещается на элемент ввода Autocomplete
, но фокус сразу возвращается на Modal
из-за его " навязывать фокус "функциональности. Если вы добавите свойство disableEnforceFocus
к Modal
, , вы увидите , что при нажатии на Modal
(например, на TextField) курсор остается на входе Autocomplete
.
Исправление заключается в том, чтобы эти два события НЕ распространялись за пределы Modal
. Вызывая event.stopPropagation()
для событий click и mouse-down на Modal
, он предотвращает выполнение функциональности Autocomplete
для этих двух событий, когда эти события происходят в Modal
.
<Modal
onClick={event => event.stopPropagation()}
onMouseDown={event => event.stopPropagation()}
...
Связанный ответ: Как создать первый интерактивный параметр в автозаполнении лабораторных интерфейсов материалов