Umbrella JS предоставляет лёгкий и гибкий способ расширения функциональности через плагины. Плагины позволяют добавлять собственные методы к объектам Umbrella, обеспечивая удобный синтаксис цепочек и совместимость с остальным API.
Создание плагина в Umbrella JS строится вокруг двух ключевых принципов: расширение прототипа и поддержка цепочек вызовов.
Все объекты Umbrella создаются через функцию u(),
которая возвращает объект с прототипом u.fn. Для добавления
нового метода необходимо расширить этот прототип:
u.fn.myPlugin = function(options) {
// Логика метода
return this; // Возврат объекта для цепочек
};
Особенности:
this внутри метода ссылается на текущую коллекцию
элементов Umbrella.this обеспечивает возможность цепочек вызовов
(u('div').myPlugin().addClass('highlight')).Типичный плагин содержит несколько компонентов:
options = options || {};
const defaults = { color: 'red', fontSize: '16px' };
const settings = Object.assign({}, defaults, options);
this.each(function(el) {
el.style.color = settings.color;
el.style.fontSize = settings.fontSize;
});
Метод each в Umbrella JS упрощает перебор коллекции
элементов, аналогично Array.prototype.forEach.
return this;
Создадим плагин highlight, который изменяет фон и текст
выбранных элементов:
u.fn.highlight = function(options) {
options = options || {};
const settings = Object.assign({
background: 'yellow',
color: 'black'
}, options);
this.each(function(el) {
el.style.backgroundColor = settings.background;
el.style.color = settings.color;
});
return this;
};
Использование:
u('p').highlight({ background: 'orange', color: 'white' });
Цепочки вызовов позволяют применять несколько методов Umbrella
подряд. Для этого необходимо возвращать объект
this на каждом этапе.
Пример цепочки с нашим плагином:
u('div')
.highlight({ background: 'lightblue' })
.addClass('active')
.css('border', '1px solid blue');
Все методы в цепочке работают с одной и той же коллекцией элементов.
Плагины могут добавлять обработчики событий:
u.fn.onHoverHighli ght = function(color) {
this.each(function(el) {
u(el).on('mouseenter', function() {
el.style.backgroundColor = color;
});
u(el).on('mouseleave', function() {
el.style.backgroundColor = '';
});
});
return this;
};
Использование:
u('li').onHoverHighlight('lightgreen');
Для сложных плагинов рекомендуется выносить повторяющиеся действия в приватные функции:
u.fn.tooltip = function(options) {
const settings = Object.assign({ text: 'Tooltip' }, options);
function createTooltip(el) {
const tooltip = document.createElement('span');
tooltip.className = 'tooltip';
tooltip.textContent = settings.text;
el.appendChild(tooltip);
}
this.each(function(el) {
createTooltip(el);
});
return this;
};
Приватные функции не добавляются в глобальный прототип, что позволяет избежать конфликтов и сохраняет чистоту пространства имён.
Umbrella JS работает с набором элементов, поэтому плагины должны обрабатывать каждый элемент коллекции независимо:
this.each(function(el, index) {
el.textContent = `Элемент ${index + 1}`;
});
В метод each передаётся второй аргумент — индекс
текущего элемента, что удобно для нумерации или привязки данных.
Хорошие плагины всегда поддерживают гибкую настройку:
const defaults = { duration: 300, easing: 'linear' };
const settings = Object.assign({}, defaults, options);
Иногда требуется вернуть значение, а не this. В таких
случаях рекомендуется предусматривать отдельные методы:
u.fn.getTextLength = function() {
if (this.length > 0) {
return this[0].textContent.length;
}
return 0;
};
Пример:
const len = u('p').getTextLength();
console.log(len);
Такие методы разрывают цепочку, поэтому нужно чётко разделять методы для цепочек и методы для получения данных.
highlightText,
toggleVisibility).addClass, css, on).