Skip to main content
Svelte 基础
介绍
响应式
属性
逻辑
事件
绑定
类和样式
Actions
过渡动画
Svelte 进阶
高级响应性
复用内容
Motion
高级绑定
高级过渡效果
Context API
特殊元素
<script module>
后续步骤
SvelteKit 基础
介绍
路由
加载数据
请求头和 Cookie
共享模块
表单
API 路由
$app/state
错误和重定向
SvelteKit 进阶
钩子函数
页面选项
链接选项
高级路由
高级加载
环境变量
结论

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

假设我们想要在博客文章页面添加一个”更多文章”的侧边栏。我们可以src/routes/blog/[slug]/+page.server.jsload 函数中返回 summaries,就像在 src/routes/blog/+page.server.js 中那样,但这会导致代码重复。

相反,让我们将 src/routes/blog/+page.server.js 重命名为 src/routes/blog/+layout.server.js。注意 /blog 路由继续正常工作 — data.summaries 仍然可以在页面中使用。

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

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

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

在 GitHub 编辑此页面

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