搜索和分页

使用搜索和分页助手创建动态页面。

变量 searchpaginate 是全局函数,允许搜索其他页面并对结果进行分页。

搜索页面

函数 search.pages() 返回一个页面数组,你可以对其进行过滤和排序。例如,要搜索变量 category 等于 music 的页面,请使用以下代码:

<ul>
  {{ for page of search.pages("category=music") }}
  <li>{{ page.title }}</li>
  {{ /for }}
</ul>

返回的每个 page 都是一个对象,其中包含分配给此页面的数据(例如 front matter 中的变量,或 _data.* 文件中的变量)。在上面的示例中,我们使用每个页面的标题来构建列表。

search 助手非常强大,并且具有更多有趣的功能。请转到 Search 插件文档 获取更多信息。

分页

在 Lume 中,你可以使用 generator 创建多个页面。分页基本上是相同的概念:使用搜索结果创建多个页面。

假设我们要对一些页面进行分页,每组 10 个元素。我们可以使用 generator 手动完成此操作:

export default function* ({ search }) {
  // 选择页面
  const pages = search.pages("category=music");
  const totalResults = pages.length;

  let currentPage = 1;

  while (pages.length) {
    // 提取前 10 个结果
    const results = pages.splice(0, 10);

    yield {
      layout: "layouts/post-list.vto",
      url: `/music/page-${currentPage}/`,
      results,
      pagination: {
        currentPage,
        totalResults,
      },
    };

    // 增加页码
    ++currentPage;
  }
}

在此示例中,我们选择了所有页面,为每 10 个结果生成一个页面,URL 分别为 /music/page-1//music/page-2//music/page-3/ 等。每个页面都使用布局 layouts/post-list.vto,该布局将接收变量 results(包含此页面要显示的结果数组)和 pagination(包含一些有用的信息,例如当前页码或总结果数)等。

Paginate 插件(在 Lume 中默认启用)公开了 paginate 助手,以简化此过程。前面的示例可以用这种更简单的方式完成:

export const layout = "layouts/post-list.vto";

export default function* ({ search, paginate }) {
  const musicPages = search.pages("category=music");

  for (const page of paginate(musicPages))) {
    yield page;
  }
}

请转到 paginate 插件文档 获取更多信息。