0

我有一个简单的十一网站 v0.11.0

我在前面使用标签来生成集合。

前任:

---
title: Some post
tags:
 - apple
 - banana
 - soccer
---

我想为每个标签/集合显示一个列表,但我不知道该怎么做。

4

3 回答 3

2

我可以通过在我的 .eleventy 文件中创建一个新集合来让它工作......

    eleventyConfig.addCollection("tagsList", function(collectionApi) {
        const tagsList = new Set();
        collectionApi.getAll().map( item => {
            if (item.data.tags) { // handle pages that don't have tags
                item.data.tags.map( tag => tagsList.add(tag))
            }
        });
        return tagsList;
    });

然后在模板中:

{% for tag in collections.tagsList %}
    <a href="/tags/{{tag}}">{{tag}}</a>
{% endfor %}

但这感觉很hacky,我怀疑必须有更好的方法来做到这一点。

于 2021-02-06T23:35:29.103 回答
0

我的工作代码版本

      // Display tag list on page
  eleventyConfig.addCollection('tagsList', function (collectionApi) {
    const tagsList = new Set()
    collectionApi.getAll().map((item) => {
      if (item.data.tags) {
        // handle pages that don't have tags
        item.data.tags.filter((tag) => !['yourtag'].includes(tag)).map((tag) => tagsList.add(tag))
      }
    })
    return tagsList
  })
于 2022-01-10T21:32:56.497 回答
0

你自己的答案对我来说似乎很正确。一些评论:

以下是我创建集合的方式(与您的解决方案非常相似):

config.addCollection('tagsList', (collectionApi) => {
  const tagsSet = new Set()
  collectionApi.getAll().forEach((item) => {
    if (!item.data.tags) return
    item.data.tags.forEach((tag) => tagsSet.add(tag))
  })
  return tagsSet
})

模板中的用法是相同的。

奖励:过滤(不包括标签“foo”和“bar”)和字母排序:

config.addCollection('tagsList', (collectionApi) => {
  const tagsSet = new Set()
  collectionApi.getAll().forEach((item) => {
    if (!item.data.tags) return
    item.data.tags
      .filter((tag) => !['foo', 'bar'].includes(tag))
      .forEach((tag) => tagsSet.add(tag))
  })
  return [...tagsSet].sort((a, b) => b.localeCompare(a))
})
于 2021-02-13T15:29:01.290 回答