Skip to main content
基本 Svelte
介绍
反应性
属性
逻辑
事件
绑定
类和样式
动作
转换
高级 Svelte
高级反应性
重用内容
运动
高级绑定
高级转换
上下文 API
特殊元素
<script module>
后续步骤
基本 SvelteKit
介绍
路由
加载数据
标题和 cookie
共享模块
表单
API 路由
$app/state
错误和重定向
高级 SvelteKit
钩子
页面选项
链接选项
高级路由
高级加载
环境变量
结论

就像 +layout.svelte 文件为每个子路由创建 UI 一样,+layout.server.js 文件为每个子路由加载数据。

¥Just as +layout.svelte files create UI for every child route, +layout.server.js files load data for every child route.

假设我们将更多帖子的侧边栏添加到我们的博客文章页面。我们可以从 src/routes/blog/[slug]/+page.server.js 中的 load 函数返回 summaries,就像我们在 src/routes/blog/+page.server.js 中所做的那样,但那样会重复。

¥Suppose we’d like to add a ‘more posts’ sidebar to our blog post page. We could return summaries from the load function in src/routes/blog/[slug]/+page.server.js, like we do in src/routes/blog/+page.server.js, but that would be repetitive.

相反,让我们将 src/routes/blog/+page.server.js 重命名为 src/routes/blog/+layout.server.js。请注意,/blog 路由继续工作 - data.summaries 仍然可用于页面。

¥Instead, let’s rename src/routes/blog/+page.server.js to src/routes/blog/+layout.server.js. Notice that the /blog route continues to work — data.summaries is still available to the page.

现在,在帖子页面的布局中添加一个侧边栏:

¥Now, add a sidebar in the layout for the post page:

src/routes/blog/[slug]/+layout
<script>
	let { data, children } = $props();
</script>

<div class="layout">
	<main>
		{@render children()}
	</main>

	<aside>
		<h2>More posts</h2>
		<ul>
			{#each data.summaries as { slug, title }}
				<li>
					<a href="/blog/{slug}">{title}</a>
				</li>
			{/each}
		</ul>
	</aside>
</div>

<style>
	@media (min-width: 640px) {
		.layout {
			display: grid;
			gap: 2em;
			grid-template-columns: 1fr 16em;
		}
	}
</style>
<script lang="ts">
	let { data, children } = $props();
</script>

<div class="layout">
	<main>
		{@render children()}
	</main>

	<aside>
		<h2>More posts</h2>
		<ul>
			{#each data.summaries as { slug, title }}
				<li>
					<a href="/blog/{slug}">{title}</a>
				</li>
			{/each}
		</ul>
	</aside>
</div>

<style>
	@media (min-width: 640px) {
		.layout {
			display: grid;
			gap: 2em;
			grid-template-columns: 1fr 16em;
		}
	}
</style>

布局(及其下方的任何页面)从父 +layout.server.js 继承 data.summaries

¥The layout (and any page below it) inherits data.summaries from the parent +layout.server.js.

当我们从一篇文章导航到另一篇文章时,我们只需要加载文章本身的数据 - 布局数据仍然有效。有关 invalidation 的文档以了解更多信息。

¥When we navigate from one post to another, we only need to load the data for the post itself — the layout data is still valid. See the documentation on invalidation to learn more.

上一页 下一页
1
2
<p>home</p>