Учимся 11ty Часть 10: Объединяем все вместе

В нашей последней статье мы использовали внешние данные для отображения постов на нашем сайте.

Если вы заметили, у нас нет того классного «Предыдущего/Следующего сообщения», которое было внизу наших сообщений раньше.

Разве не здорово было бы вернуть их обратно? Это и является основной темой данной статьи.

Давайте сначала посмотрим, как выглядела наша пагинация постов раньше с локальными постами

 {% set previousPost = collections.post | getPreviousCollectionItem(page) %}
 {% set nextPost = collections.post | getNextCollectionItem(page) %}

 {% if previousPost %}Previous: <a href="{{ previousPost.url }}">{{ previousPost.data.title }}</a>{% endif %}
 <br>
 {% if nextPost %}Next: <a href="{{ nextPost.url }}">{{ nextPost.data.title }}</a>{% endif %}
Вход в полноэкранный режим Выход из полноэкранного режима

Выше мы использовали то, что я назвал одним из краеугольных камней Eleventy — коллекции.

Этот метод не будет работать для постов, которые мы получили из Hashnode, потому что они не являются частью коллекции, как те посты, которые у нас были.

Чтобы вернуть эту функциональность, нам нужно добавить пару вещей в наш .eleventy.js.

Коллекция

Когда мы начинали эту серию статей, мы создали коллекцию — для наших страниц. Мы собираемся использовать те же знания для создания коллекции из наших постов Hashnode.

В .eleventy.js добавьте следующее:

 eleventyConfig.addCollection("articles", async () => {
    const endpoint = `https://api.hashnode.com/`;
    const { GraphQLClient, gql } = require("graphql-request");

    const client = new GraphQLClient(endpoint);

    const query = gql`
      {
        user(username: "Psypher1") {
          publication {
            posts {
              title
              coverImage
              brief
              slug
              dateAdded
              contentMarkdown
            }
          }
        }
      }
    `;

    const articles = await client.request(query);

    return articles.user.publication.posts;
  });

Войти в полноэкранный режим Выйти из полноэкранного режима

Мы использовали ту же часть кода, что и в файле posts.js, но на этот раз для создания коллекции.

Фильтр

В нашем оригинальном коде мы также использовали этот фильтр: getPreviousCollectionItem(page) — это то, что позволяет нам получить следующую и предыдущую функциональность.

Для этого мы также сделаем фильтр в том же файле .eleventy.js.

elevntyConfig.addFilter("nextArticle", (articles, page, modifier = 1) => {
    const parts = page.outputPath.split("/");
    parts.pop(); // get rid of `index.html`
    const slug = parts.pop();
    for (const [index, article] of articles.entries()) {
      const target = index + modifier;
      if (article.slug === slug && target >= 0 && target < articles.length) {
        return articles[target];
      }
    }
  });

Вход в полноэкранный режим Выйти из полноэкранного режима

То, что мы сделали сейчас, работает:
Данные (статьи), возвращаемые в коллекции, как бы определяют, как будут работать следующий/предыдущий.

Частичная пагинация

Затем мы изменим/создадим наш файл _paginate.njk, чтобы он выглядел следующим образом:

{% set previousPost = collections.articles | nextArticle(page) %}
{% set nextPost = collections.articles | nextArticle(page, -1) %}

 {% if previousPost %}Previous: <a href="/blog/{{ previousPost.slug }}">{{ previousPost.title }}</a>{% endif %}
 <br>
 {% if nextPost %}Next: <a href="/blog/{{ nextPost.slug }}">{{ nextPost.title }}</a>{% endif %}
Вход в полноэкранный режим Выход из полноэкранного режима

Затем мы заходим в наш файл postLayout.njk и включаем его в нижней части

{% include "partials/_paginate.njk" %}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот и все. Мы вернулись туда, где были.


Особая благодарность выражается Шиву Джа-Матхуру из Eleventy Discord, который предоставил руководство и решение этой конкретной головоломки.


Мой поиск для вас

Теперь, когда мы увидели, как мы можем получать статьи из API и при этом иметь ту же функциональность, что и при использовании локальных статей. Попробуйте посмотреть, как можно объединить все, чему мы научились в этой серии, в один полноценный сайт.

Тем временем я займусь обновлением репо серии — сделаю разные ветки для каждой части.

Пожелайте мне удачи 😄


Спасибо, что прочитали, давайте общаться!

Спасибо, что посетили этот мой маленький уголок. Давайте общаться в Twitter, Polywork и LinkedIn

Оцените статью
devanswers.ru
Добавить комментарий