Slim.js — это легковесная библиотека для создания компонентного интерфейса на JavaScript, ориентированная на декларативное управление DOM. Основная работа с данными в Slim.js строится на реактивных свойствах компонентов, что накладывает определённые особенности на использование циклов и итераций по массивам.
each для перебора массивовВ Slim.js ключевым инструментом для работы с массивами в шаблоне
является директива each. Она позволяет динамически
генерировать элементы DOM на основе элементов массива.
Синтаксис:
<div each="item in items">
<span>{item.name}</span>
</div>
each="item in items" — указывает на массив
items и текущий элемент item.Slim.js отслеживает изменения массивов с помощью прокси-объектов.
Методы, изменяющие массив, такие как push,
pop, splice, shift,
unshift, автоматически обновляют отображение в шаблоне.
class TodoList extends Slim {
items = [
{ name: "Купить продукты" },
{ name: "Прочитать книгу" }
];
addItem(task) {
this.items.push({ name: task });
}
removeItem(index) {
this.items.splice(index, 1);
}
}
Шаблон для этого компонента:
<ul>
<li each="task in items">
{task.name}
<button click="removeItem(index)">Удалить</button>
</li>
</ul>
index — встроенная переменная, доступная в каждом цикле
each.push, splice)
автоматически обновляет DOM без ручного вмешательства.Для оптимизации производительности и корректного обновления элементов рекомендуется использовать ключи. Ключи помогают библиотеке Slim.js точно идентифицировать элементы при изменении массива.
<li each="task, i in items" key="{task.id}">
{task.name}
</li>
task, i in items — второй параметр i
предоставляет индекс элемента.key="{task.id}" — уникальный идентификатор элемента
массива. При изменении массива Slim.js будет использовать ключ для
минимизации пересоздания DOM-узлов.Slim.js позволяет создавать вложенные циклы для работы с массивами объектов с вложенными массивами.
<div each="user in users">
<h3>{user.name}</h3>
<ul>
<li each="task in user.tasks">{task.title}</li>
</ul>
</div>
tasks каждого пользователя
автоматически отражается в DOM.if, создавая гибкую реактивную логику отображения.Помимо шаблонных циклов each, массивы в Slim.js можно
обрабатывать обычными методами JavaScript, сохраняя реактивность.
updateTaskName(index, newName) {
this.items[index].name = newName;
this.items = [...this.items]; // Важно, чтобы Slim.js увидел изменение массива
}
[...]) или
методов типа map гарантирует реактивное обновление.this.items = this.items.map(item =>
item.id === updatedId ? { ...item, name: updatedName } : item
);
Slim.js позволяет использовать вычисляемые свойства для динамической фильтрации и сортировки массивов, сохраняя шаблон компактным:
get completedTasks() {
return this.items.filter(task => task.completed);
}
Шаблон:
<li each="task in completedTasks">{task.name}</li>
items.key обязательно,
иначе при обновлении списка будут пересоздаваться все DOM-элементы, что
снижает производительность.push, splice), либо через
присвоение нового массива.Slim.js объединяет декларативный подход к шаблонам с реактивной обработкой данных, что делает итерацию по массивам интуитивной, гибкой и безопасной с точки зрения обновления интерфейса.