Проблема в том, что Tab вызывает закрытие родительского меню, что приводит к отключению диалога.Вы можете использовать состояние, чтобы предотвратить закрытие родительского меню при каждом открытии диалога, но это оставляет другую проблему.Независимо от того, закрывается ли родительское меню, при возникновении Tab он вызывает event.preventDefault()
, что затем не позволяет Tab изменить местоположение фокуса (поведение браузера по умолчанию).
Вы можете исправить это, остановив распространение Dialog
ключевого события Tab .Это предотвращает получение Menu
, поэтому Menu
не будет пытаться закрыться и не будет вызывать event.preventDefault()
.Я не могу гарантировать, что это не приведет к появлению некоторых новых проблем, но это устраняет описанную проблему.
const stopPropagationForTab = (event) => {
if (event.key === "Tab") {
event.stopPropagation();
}
};
<Dialog
onKeyDown={stopPropagationForTab}

В моем форкеВаша песочница, я обновил версию Material-UI с 1.2 до 4.0 только потому, что хотел убедиться, что проблемы не связаны с аспектами, которые изменились.Это отбросило некоторые стили, но основное поведение, о котором идет речь, казалось, работало одинаково в обеих версиях.
Другим способом решения этой проблемы было бы переработать код так, чтобы диалогбольше не дитя меню.Если щелкнуть пункт меню, открывающий диалоговое окно, на верхнем уровне будет установлено состояние для закрытия всех меню и открытия диалогового окна.Вероятно, это был бы лучший способ справиться с этим, но это большее изменение в структуре кода.