Не удалось исправить размещение поппера в автозаполнении

#reactjs #material-ui #popper.js

#reactjs #материал-пользовательский интерфейс #popper.js

Вопрос:

Я использую <Autocomplete /> компонент Material-UI, и у меня возникла ситуация, когда я хочу, чтобы мой выпадающий список всегда отображался внизу. Поэтому я сделал это:

 PopperComponent={(props) => <Popper {...props} placement='bottom-start' />}
  

Мой выпадающий список все еще иногда появляется вверху.

Более того, когда я сделал выше, ширина моего поппера больше не соответствует ширине моего автозаполнения.

Тогда я решил, что хочу изменить zIndex поппера, чтобы панель приложений не закрывала его, если положение поппера переключается на верхнее.

Как я могу это исправить?

Ответ №1:

Да, placement кажется, что он сломан при использовании в поппере автозаполнения (material-ui v. 4.11.4).

Хак, который сработал для меня, заключается в следующем:

 <Autocomplete
  // Force menu to open below, with the correct width
  PopperComponent={({ style, ...props }) => (
    <Popper
      {...props}
      style={{ ...style, height: 0 }} // width is passed in 'style' prop
    />
  )}
  // Set menu max height (optional)
  ListboxProps={{ style: { maxHeight: '30vh' } }}
/>
  

Ответ №2:

Я использую MUI 5.4.4 и столкнулся с аналогичной проблемой, когда компонент Autocompelete s Popper пытался перевернуться наверх (и поэтому исчезал), когда внизу страницы было недостаточно места. Я исправил проблему, создав пользовательский компонент popper с flip модификатором с fallbackPlacements параметром, установленным в пустой массив, и установив для popperOptions размещения значение bottom, чтобы Popper меню всегда было внизу, независимо от того, достаточно места или нет.

Документы popper для модификатора flip довольно хорошо объяснили это.

Пользовательский поппер:

 const CustomerPopper = (props) => {
  const modifiers = [
    {
      name: 'flip',
      options: {
        fallbackPlacements: []
      },
    },
  ]

  return (
    <Popper
      {...props}
      modifiers={modifiers}
      popperOptions={{
        placement: 'bottom',
      }}
    />
  )
}
  

Автозаполнение:

 <Autocomplete
  {...otherStuff}
  PopperComponent={(props) => <CustomerPopper {...props} />}
/>
  

Ответ №3:

Если кто-то все еще ищет ответ. Вы можете добиться этого с помощью модификатора flip

 const CustomerPopper = (props: any) => <Popper
        {...props} 
        modifiers={{
            flip: {
                enabled: false,
            }
        }}
        popperOptions={{
         placement:'bottom',
        }}
    />;