0

这里有一个更高级的问题......是否可以通过几个宏传递一个集合?例如,我有一个博客文章部分:

{% from "components/switchers/topCoupons.njk" import topBonuses %}
            {{ topCoupons(
              title = "Top Coupons",
              blurb = "some body text content",
              posts = collections.coupon
            ) }}

然后在帖子宏中,我有一个滑块宏:

{% from "components/sliders/generalSlider.njk" import generalSlider %}
{{ generalSlider(
slides = posts
) }}

然后在滑块宏中,我有一个卡片宏:

{%- for slide in slides -%}
{% from "components/cards/card.njk" import card %}
{{ card(
title = posts
) }}
{%- endfor -%}

目前它不起作用,但我想知道我该如何处理这种情况以及 Eleventy 和 Nunjucks 是否甚至提供这种类型的功能,解决方案是什么,或者我是否最好使用另一个具有此功能的 SSG什么样的基础设施?

目前,它在尝试编译时抛出此错误:

[eleventy:dev] `TemplateContentRenderError` was thrown
[eleventy:dev] > (./src/index.njk)
[eleventy:dev]   TypeError: Converting circular structure to JSON

非常感谢任何和所有的见解。谢谢 :)

4

1 回答 1

0

通过嵌套宏传递 Eleventy 集合本身并没有错,因为集合只是一个常规的 JavaScript 数组。问题的出现取决于您如何在 Nunjucks 中使用集合,因为集合对象是一个循环结构。

您可以通过将集合传递给宏并仅访问集合中的单个属性来亲自尝试。

{# include.njk #}
{% macro navigation(data) %}
    <ol>
        {%- for page in data -%}
            <li>
                <a href="{{ page.url }}">{{ page.data.title }}</a>
            </li>
        {%- endfor -%}
    </ol>
{% endmacro %}

{{ navigation(collections.all) }}

即使有更多的宏嵌套,此设置也能正常工作。您遇到的错误来自使用dump过滤器之类的操作。

{# include.njk #}
{{ collections.all | dump }}

因为我不知道你的宏在做什么,我不确定是什么导致错误被抛出,但你可能想要寻找可能是JSON.stringify集合对象的东西。根据您的用例,您可能必须自己手动解析对象、查找外部库或仅使用您需要的字段。创建自定义 Eleventy 过滤器可能会有所帮助。

于 2021-09-13T03:57:06.320 回答