Объект state в Popper.js является центральной структурой
данных, которая хранит текущее состояние поппера, его позиции, размеры,
а также параметры, переданные при инициализации. Важнейшей частью
state является поле options, содержащее
конфигурацию, определяющую поведение и внешний вид поппера. Понимание
структуры и назначения state.options позволяет гибко
управлять позиционированием и поведением всплывающих элементов.
state.optionsПоле options имеет тип объекта и включает следующие
ключевые элементы:
state.options = {
placement: 'bottom', // базовое расположение поппера относительно reference
modifiers: [], // массив модификаторов для изменения поведения поппера
strategy: 'absolute', // стратегия позиционирования ('absolute' или 'fixed')
onFirstUpdate: () => {}, // callback, вызываемый при первом обновлении
};
placementreference).'top', 'bottom',
'left', 'right', с вариациями
-start и -end (например,
'bottom-start').placement используется движком Popper.js для вычисления
координат на основе размеров элементов и окна.modifiersМассив объектов, описывающих модификаторы.
Модификатор — это объект с ключами:
{
name: 'offset',
options: { offset: [0, 10] },
enabled: true,
phase: 'main', // этап, на котором применяется модификатор
fn: ({ state, options, name }) => { /* логика модификатора */ }
}В state.options.modifiers хранится список всех
модификаторов, активных для текущего поппера.
Модификаторы могут менять положение, размеры, стрелки, ограничивать выход за границы окна и многое другое.
strategyОпределяет CSS-стратегию позиционирования элемента:
'absolute' — поппер позиционируется относительно
ближайшего предка с позиционированием;'fixed' — поппер фиксирован относительно окна.В state.options.strategy хранится выбранная
стратегия, которая используется движком при вычислении координат и
генерации стилей.
onFirstUpdateplacement или модификаторов при первой
отрисовке.state.options с state.modifiersDataКаждый модификатор, указанный в state.options.modifiers,
при выполнении функции fn получает доступ к
state. В частности, state.modifiersData
содержит промежуточные результаты работы других модификаторов:
state.modifiersData[name] = {...};
Пример: модификатор offset записывает рассчитанное
смещение в state.modifiersData.offset. Это позволяет другим
модификаторам учитывать уже примененные изменения при расчете финального
положения.
state.optionsPopper.js позволяет менять параметры конфигурации на лету, обновляя
state.options через методы экземпляра
popperInstance.setOptions():
popperInstance.setOptions({
placement: 'top-end',
modifiers: [
{ name: 'offset', options: { offset: [0, 20] } }
]
});
modifiers определяет последовательность их
применения. Модификаторы с более высоким приоритетом должны стоять
раньше.state.options или методы экземпляра.beforeRead, read, main,
write), которая влияет на момент изменения данных в
state.options и state.modifiersData.state.options внутри реактивной среды важно
использовать методы Popper.js, а не прямую мутацию объекта, чтобы
избежать рассинхронизации расчетов.state.optionsconst popperOptions = {
placement: 'bottom-start',
strategy: 'fixed',
modifiers: [
{ name: 'offset', options: { offset: [0, 12] }, enabled: true },
{ name: 'flip', options: { fallbackPlacements: ['top', 'right'] }, enabled: true },
{ name: 'preventOverflow', options: { padding: 8 }, enabled: true }
],
onFirstUpdate: ({ state }) => {
console.log('Поппер инициализирован с координатами', state.rects.popper);
}
};
state.options, можно полностью контролировать
поведение поппера в любых условиях.