Eu uso um Select
componente (suponha que este ). Por padrão, um Popover
componente aparece logo abaixo do campo de seleção, mas quero colocá-lo no lado direito. Descreverei abaixo as maneiras pelas quais tentei alcançar esse comportamento e como falhei todas as vezes. Lembre-se de que sou um novato no MUI.
A maneira mais adequada de mudar a posição é configurar
anchorOrigin
etransformOrigin
adereços, mas só funciona se você puder acessar esses adereços. OSelect
componente cria oPopover
por conta própria (ou mais precisamente, umMenu
componente dentro doSelect
) e não fornece uma API para propagar adereços.O
Menu
componente possui umaPopoverClasses
prop que se propagaclasses
para oPopover
, então eu queria mudar de posição substituindoleft
etop
estilos com valores calculados por JS. Mas não importa o quanto eu tentasse descobrir como funcionava, não consegui. Todos os guias que encontrei usammakeStyles
ou"@mui/styles"
estãocreateUseStyles
obsoletos"react-jss"
desde o MUI v5. O prop estáclasses
totalmente obsoleto no MUI v5?Adicionar estilos como
"& .MuiPopover-root"
ouSelect
nãoMenu
funcionou também, porque ele éPopover
criado próximo ao topo do DOM para funcionar como uma caixa de diálogo modal e não é filho doSelect
.Apesar de
Menu
não propagar adereços para oPopover
diretamente, ele propaga adereços para aMenuList
que é filho doPopover
. UsandoMenuListProps: {ref=myRef}
posso acessar o elemento DOM doPopover
bymyRef.current.parentElement
. Mas não é suficiente, porque não tenho nenhum evento bom para substituir valores. OPopover
é criado após um curto período de tempo após umonOpen
evento ser acionadoSelect
, portanto, durante o evento, um valormyRef.current
é indefinido e depoissetTimeout()
é tarde demais - é perceptível comoPopover
salta.
É muito difícil para uma ação tão simples. Perdi algo óbvio?
Usando
Select
o componente você pode propagar seusPopover
adereços através daMenuProps
propriedade.Funciona porque
Menu
na verdade propaga propsPopover
e pode aceitar todas as suas propriedades, conforme descrito na documentaçãoExemplo: