Svelte基础
Svelte高阶
上下文API
特殊元素
接下来
SvelteKit基础
Shared modules
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion
就像+layout.svelte可以为所有子路由创建用户界面,+layout.server.js可以为所有子路由加载数据.
比如我们现在页面上添加个 more posts(更多内容)按钮,我们可以在src/routes/blog/[slug]/+page.server.js中的load函数中返回summaries用于显示更多博客内容. 但这样做显得功能有些重复. 我们可以把src/rotues/blog/+page.server.js更名为src/routes/blog/+layout.server.js. 这样并不会影响/blog路由并且在页面中仍然可以使用data.summeries.
接下来修改博客页面:
Just as
+layout.sveltefiles create UI for every child route,+layout.server.jsfiles load data for every child route. Suppose we’d like to add a ‘more posts’ sidebar to our blog post page. We could returnsummariesfrom theloadfunction insrc/routes/blog/[slug]/+page.server.js, like we do insrc/routes/blog/+page.server.js, but that would be repetitive. Instead, let’s renamesrc/routes/blog/+page.server.jstosrc/routes/blog/+layout.server.js. Notice that the/blogroute continues to work —data.summariesis still available to the page. Now, add a sidebar in the layout for the post page:
<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.summariesfrom 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.
<p>home</p>