共享数据

添加自定义数据,这些数据可以被目录中所有页面共享

除了在页面和布局中定义的变量之外,你还可以存储一些或所有页面都可以访问的数据。共享数据必须保存在 _data 目录或 _data.* 文件中,文件扩展名可以是 .json.yaml.js.ts

.json.yaml 格式适用于静态数据。.js.ts 更适合动态数据(例如,从 API 或数据库获取的数据):

{
  "people": [
    {
      "name": "Oscar Otero",
      "color": "black"
    },
    {
      "name": "Laura Rubio",
      "color": "blue"
    }
  ]
}
people:
  - name: Oscar Otero
    color: black

  - name: Laura Rubio
    color: blue
import { db } from "./database.ts";

const people = db.query("select name, color from people");

export { people };

_data.* 文件

任何命名为 _data.* 的文件都会被加载,并且其内容可以被同一目录或子目录中的所有页面访问。

├── _data.yaml      # 与所有页面共享的数据
├── index.md
└── documentation
    └── _data.json  # 与此目录和子目录中的页面共享
    └── doc1.md
    └── doc2.md
    └── examples
        └── _data.json  # 与此目录和子目录中的页面共享
        └── example1.md
        └── example2.md

如你所见,共享数据会沿着目录结构以级联的方式传播。一个典型的用例是存储那些在同一目录下的所有页面中通用的变量,这样你就不必在每个页面中重复它们。

_data 目录

_data 目录类似于 _data 文件,但不同之处在于,数据不是存储在一个文件中,而是存储在该目录内的多个文件中。每个文件的 basename(基本名称)决定了用于访问数据的变量名。让我们看一个例子:

└── _data
    └── users.json
    └── documents
        └── one.js
        └── two.js
        └── three.js

在这个例子中,存储在 _data/users.json 文件中的数据可以通过 users 变量访问,而文档可以通过 documents.onedocuments.twodocuments.three 访问。要在你的页面中使用这些数据:

<h2>文档</h2>

<ul>
{{ for doc of documents }}
  <li>
    {{ doc.title }}
  </li>
{{ /for }}
</ul>
export default function ({ documents }) {
  return (
    <>
      <h2>文档</h2>

      <ul>
        {documents.map((doc) => <li>{doc.title}</li>)}
      </ul>
    </>
  );
}

_data.* 文件一样,你可以在不同的位置拥有 _data 目录,以便它们仅与同一目录或子目录中的所有页面共享。