Реализация функции Cycler из Nunjucks в шаблонах Astro

В шаблонизаторе Nunjucks имеется очень полезная функция - Cycler. Вот фрагмент из документации Nunjucks:

An easy way to rotate through several values is to use Cycler, which takes any number of arguments and cycles through them.

// page.njk
{% set cls = cycler("odd", "even") %}
{% for row in rows %}
  <div class="{{ cls.next() }}">{{ row.name }}</div>
{% endfor %}

В этом примере нечётные строки получают класс odd, а чётные строки - класс even.

При вёрстке сайта на Astro мне очень недоставало этой функции в шаблонах .astro. Но Astro тем и хорош, что позволяет, без особых усилий, самостоятельно добавить в шаблонизатор любую недостающую функцию.

В папке src создаём подпапку utils, в которой создаём файл helpers.js:

// src/utils/helpers.js
export class Cycler {
  constructor(array) {
    this.current = 0;
    this.array = array;
  }
  next = () => {
    if (this.current > this.array.length - 1) this.current = 0;
    return this.array[this.current++];
  };
}

Здесь мы экспортируем класс Cycler. Объект класса Cycler, при инициализации, принимает массив значений в качестве параметра. Далее, метод next() каждый раз будет возвращать следующее значение массива, циклически возвращаясь в начало массива при его окончании.

Теперь, в любом шаблоне Astro, можно задействовать Cycler следующим образом:

// page.astro
---
import { Cycler } from "../utils/helpers";
const cls = new Cycler(["odd", "even"]);
---
{rows.map((row) => (
  <div class={cls.next()}>{row.name}</div>
))}
AG & Dev © 2020 Moscow