Это $w.Repeater
самый популярный элемент на сайтах Wix, который в первую очередь снижает производительность. В этой статье мы рассмотрим, как сделать повторитель быстрее.
Работаю с платформой Velo уже больше года. Элемент $w.Repeater
наиболее популярен в наших проектах, это отличный элемент с большим потенциалом гибкости. Мы действительно используем его очень часто.
Но у репитера есть проблема с производительностью. Чем больше мы используем элементов в контейнерах повторителей, тем медленнее он работает. Например, карточки пользователей с контактной информацией:
$w("#repeater1").onItemReady( ($item, itemData, index) => { $item("#image1").src = itemData.avatar; $item("#firstName").text = itemData.firstName; $item("#lastName").text = itemData.lastName; $item("#company").text = itemData.compony; $item("#phone").text = itemData.phone; $item("#email").text = itemData.email; });
Нам нужно контролировать количество элементов и стараться использовать как можно меньше элементов. Для этого мы рассмотрим использование шаблонов. У этого способа есть ограничение, мы не можем использовать его с интерфейсом коллекций баз данных, мы можем использовать его только с кодом.
Установить Лодаш
Мы будем использовать функцию _.template()
из библиотеки Lodash. Сначала нам нужно установить Lodash с помощью Менеджера пакетов.
После установки мы можем использовать Lodash, просто импортируя в свой код.
import _ from "lodash";
Текстовые шаблоны
Теперь мы рассмотрим простой пример, чтобы понять, как работает шаблон.
// #1 install and import import _ from "lodash"; // #2 Use custom template delimiters. _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; // #3 Pattern string with two keys const pattern = "Hello, {{firstName}} {{lastName}}!"; // #4 Create a compiled template. const compiled = _.template(pattern); $w.onReady(function () { // #5 result: "Hello, John Doe!" $w("#text1").text = compiled({ firstName: "John", lastName: "Doe" }); });
Как это работает:
- Импорт библиотеки Lodash. Сначала вам нужно установить библиотеку из Диспетчера пакетов.
- Установка пользовательских разделителей шаблонов как
{{key}}
. Lodash использует разделители<%=key%>
по умолчанию. "более" - Строка шаблона с двумя ключами
{{firstName}}
и{{lastName}}
. - Создавая скомпилированный шаблон, он возвращает функцию
compiled()
которой будет передан объект со свойствами.{firstName:"John",lastName:"Doe"}
. - Функция
compiled()
получает объект и возвращает строку с замененными ключами на значение свойств объекта. Результат"Hello, John Doe!"
.
HTML-шаблоны
Мы можем получить HTML-контент текстового элемента по свойству .html
. $w.текст
const value = $w("#
textTemplate").html; // "<b>Bold Text</b>"
Это означает, что мы можем получить HTML текстовых элементов со всеми их стилями! Круто, почему бы нам не использовать его как шаблон…
Мы создали нужный текстовый шаблон с разметкой, стилями и ключами, куда хотим передать параметры. Затем скрываем текстовый элемент на панели свойств «Скрытый при загрузке».
В контейнере повторителя мы оставляем только два элемента #image1
и #text1
.
Нам нужно только изменить HTML элементов #text1
в контейнерах повторителей на HTML элемента шаблона #textTemplate
.
import _ from "lodash"; _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; $w.onReady(function () { // Create a compiled template const compiled = _.template( $w("#textTemplate").html ); $w("#repeater1").onItemReady( ($item, itemData, index) => { $item("#image1").src = itemData.avatar; $item("#text1").html = compiled(itemData); // use template }); // set repeater data $w("#repeater1").data = [ /* here are our users */ ]; });
Теперь это работает быстрее, потому что у нас есть только два элемента в повторителе: одно изображение и один текстовый элемент. ДЕМО