在 11ty 中处理“数据”的核心和灵魂是将内容放入 .json 或 .js 文件中,这些文件将 JavaScript 对象导出到项目的 _data 文件夹中。
假设您有一个名为 kittens.js 的文件,如下所示:
const kittens = [
{
name: 'Oreo',
colors: ['black','white'],
slug: 'oreo'
},
{
name: 'Hershey',
colors: ['brown'],
slug: 'hershey'
}
];
module.exports = () => {
return kittens;
};
关键字 kittens 现在是一个特殊关键字,就 11 个能够具有“页面”上下文的模板文件而言。
它包含有关奥利奥和好时的嵌套对象结构信息。
您所要做的就是选择一种模板语言并循环遍历它。
例如,您可以像这样将一个文件放入项目的主文件夹中,例如 loop_kittens.liquid,然后 11ty 会将其作为应该生成 HTML 的内容来选择:
---
layout: "layouts/my_base"
pagination:
alias: documentData
data: kittens
size: 1
addAllPagesToCollections: true
permalink: /kitten/{{ documentData.slug }}/index.html
---
<h1>{{documentData.name}}</h1>
<ul>
{% for color in documentData.colors %}
<li>color</li>
{% endfor %}
</ul>
我对 Drupal 不熟悉,但在来自任何基于声明性 SQL 的 (表形) 系统和进入基于命令式嵌套列表和对象形状的系统正在考虑循环数据并以不同方式选择它。
您甚至可能希望预处理这些 _data-文件夹文件中的原始数据,以便以针对传统手动 for 循环进行优化的方式将其导出到 kittens(尽管将大小设置为 1 的模板的“分页”属性肯定有助于隐藏将数据集划分为需要生成的单个 HTML 页面的复杂性).
11ty 分页还可以“分块”您的数据集,因此您只需要担心在任何给定页面上手动循环遍历给定的 kittens 子块(例如,“小猫档案”,每个 10 只小猫存档页面).
但就实际在每个页面上为每只小猫放置一个块而言,这将是您模板中的手动 for 循环,无论您选择哪种模板语言。 (我发现 Liquid 在简单性和能够将 for 循环的每次传递中的内容委托给“include”之间取得了很好的平衡,以维护模块化、组件化的代码——请参阅“dynamic partials "。)
我建议您像我刚才所做的那样制作您自己的虚拟数据,并在您开始尝试做一个真正的项目之前,在练习网站上练习使用 11ty 的所有许多模板、布局、组件包含等选项。 11ty 不是一个非常固执己见的框架,所以最好选择自己喜欢的方式来组织它并了解它的魔法文件夹命名约定。