MqHandler
MqHandler - модуль для упрощения работы с глобальными breakpoints
Основой модуля является одноименный класс MqHandler, создающий из объекта breakpoints соответствущие реактивные свойства
Module options
breakpoints
- type:
Record<string, number> - default:
default-breakpoints.json
Объект breakpoints, где в качестве ключей задаются название breakpoints, а значения - числа, соответствущие ширине экрана в px. В качестве дефолтного значения берется файл default-breakpoints.json из папки модуля. При инициализации создается экземпляр класса MqHandler, а после mount приложения происходит установка слушателей для breakpoints. Экземпляр класса доступен через свойство $mq.
Помимо этого, данный модуль также создает stylus-переменные для каждого типа breakpoint, то есть, например, переменные для
breakpoint md будут доступны как $max-md и $min-md
Class MqHandler
Properties
breakpoints
- type:
Record<string, number> - default:
{}
Свойство, идентичное вышеупомянутому одноименному свойству.
breakpointNames
- type:
string[]
Список названий текущий breakpoints.
currentState
- type:
Reactive<Record<keyof Breakpoints, Record<'max' | 'min', boolean>>>
Текущее состояние breakpoints.
isSet
- type:
Ref<boolean>
Свойство, определяющее, были ли установлены слушатели для breakpoints или нет
aggregativeListeners
- type:
Reactve<Record<string, ({matches: boolean; queryString: string}) => any>>
Reactive объект слушателей для использующихся в текущий момент времени queryString.
callbacks
- type:
Record<string, Array<({matches: boolean; queryString: string}) => any>>
Объект callbacks, соответствующих определенным queryString. Данное свойство необходимо для оптимизации работы
с непосредственными слушателями для mediaQuery, чтобы не привязывать каждый callback к mediaQuery, а иметь один слушатель,
в котором будут вызываться все callbacks.
Помимо приведенных выше свойств, для упрощения работы с currentState были созданы СomputedRef
в виде $mq[${'max' | 'min'}-${bpName}].
Methods
setupBreakpointCallbacks
- type:
() => void
Метод, для установки всех необходимых слушателей. Вызывается в модуле при mount всего приложения.
В результате isSet проставляется на true
removeBreakpointCallbacks
- type:
() => void
Данный метод аналогичен предыдущему методу с одним единственным отличием: он работает в обратном порядке.
addCallback
- type:
(queryString:string, cb: ({matches: boolean; queryString: string}) => any) => void
Метод для добавления callback для определенного queryString. В случае отсутствия слушателя для queryString, создается
соответствущий aggregativeListener
removeCallback
- type:
(queryString:string, cb: ({matches: boolean; queryString: string}) => any) => void
Метод для удаления callback для определенного queryString. Если список callbacks пуст для queryString, то aggregativeListener удаляется
static extend
- type:
<Bps extends Record<string, number>>(breakpoints: Bps) => MqHandler<Bps>
Статичный метод инициализации MqHandler для корректного type inference.
Composition
useMqHandler
- type:
<Bps extends Record<string, number>>() => MqHandler<Bps>
Возвращает экземпляр MqHandler в текущем приложении. Данный хук следует вызывать только в компонентах.
В противном случае возникнет ошибка.
onMediaQueryChange
- type:
(queryString:string, cb: ({matches: boolean; queryString: string}) => any) => void
Хук для добавления слушателя для кастомного queryString. Принцип работы состоит в добавления хука в onMounted и его снятия в onUnmounted.
Vue install
Vue 2
// main.js
import Vue from 'vue';
import { Plugin } from 'shared-front/lib/modules/mq-handler';
Vue.use(Plugin, {
breakpoints: {
lg: 1200,
md: 700,
sm: 500,
}
});
Vue 3
// main.ts
import { createApp } from 'vue';
import { Plugin } from 'shared-front/lib/modules/mq-handler';
import App from './App.vue';
const app = createApp(App);
app.use(Plugin, {
breakpoints: {
lg: 1200,
md: 700,
sm: 500,
}
});
Plugin options
breakpoints
- type:
Record<string, number> - default:
{}
Объект breakpoints, где в качестве ключей задаются название breakpoints, а значения - числа, соответствущие ширине экрана в px.
Usage
<template>
<div class="app">
App has {{ screenSize }} screen
</div>
</template>
<script>
import { ref, computed } from 'vue';
import useMqHandler from 'shared-front/lib/modules/mq-handler/use-mq-handler';
import breakpoints from './breakpoints.json';
export default {
setup() {
const $mq = useMqHandler<typeof breakpoints>();
const screenSize = computed(() => $mq['max-sm'].value ? 'small' : 'large');
return {
screenSize,
};
},
};
</script>