最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Svelte 组件脚本位置错误:items 未定义之根源与正确写法
时间:2026-06-19 09:41:03 编辑:袖梨 来源:一聚教程网
Svelte 中变量在模板中不可用,通常是因为 <script> 标签未置于组件顶层——它必须作为 Svelte 组件的根级脚本块存在,而非嵌入 HTML 的 <body> 或 <head> 内;否则将退化为普通浏览器脚本,无法参与响应式绑定。
svelte 中变量在模板中不可用,通常是因为 `<script>` 标签未置于组件顶层——它必须作为 svelte 组件的根级脚本块存在,而非嵌入 html 的 `<body>` 或 `<head>` 内;否则将退化为普通浏览器脚本,无法参与响应式绑定。</script>
在你提供的代码中,<script lang="ts"> 被错误地放置在 <body> 标签内部(且紧邻 <div class="header"> 之后),这导致 Svelte 编译器完全忽略该脚本块——它不会被识别为组件逻辑的一部分,因此声明的 items 变量对模板 {#each items as item} 来说是“未声明”的,编译时报错 Cannot find name 'items'。
✅ 正确做法:Svelte 组件必须遵循严格的三段式结构(顺序可调,但必须独立、同级):
<script lang="ts"> // ✅ 此处声明的变量/状态可在下方模板中直接使用 let items = [ { name: "test" }, { name: "potato" }, { name: "io" } ];</script><!-- ✅ 模板区域:支持 {#each}、bind:value、事件处理等 --><div class="header"> <a href="/"><b>Pot.Io</b></a> <a href="/shop"><b>Shop</b></a> <a href="/help"><b>Help</b></a></div><div class="cnt1"> {#each items as item} <div class="item"> <h1>{item.name}</h1> </div> {/each}</div><style> /* ✅ scoped CSS:仅作用于当前组件 */ .header { background-color: #Dcd517; padding: 5px 5px 5px 20px; font-family: 'Roboto', sans-serif; display: flex; justify-content: center; margin: 0; } .header a { color: black; padding: 20px; text-decoration: none; border-radius: 12px; font-size: 32px; } .header a:hover { background-color: #9d940e; } .cnt1 { display: flex; background-color: #127D0B; padding: 8px 50px; } .item { margin: 0 8px; }</style>
⚠️ 关键注意事项:
- 禁止在 <body> 或 <head> 中写 <script>:Svelte 不是 HTML 文件处理器,而是组件编译器。所有逻辑必须位于 .svelte 文件顶层 <script> 块中。
- 样式应移至 <style> 块:内联 <style> 在 <head> 中会被忽略或引发 SSR/SSG 兼容性问题;Svelte 的 <style> 自动作用域化,更安全、更可维护。
-
全局资源(如字体)请用 <svelte:head>:
<svelte:head> <link href="https://fonts.googleapis.com/css2?family=Roboto&family=Roboto+Condensed:wght@300;400&display=swap" rel="stylesheet"></svelte:head>
- 若需复用数据,推荐 export let items 作为 prop:适用于父组件传入数据的场景;而本例中 items 是本地状态,直接 let items = [...] 即可(Svelte 5+ 中建议配合 $state() 提升响应式可靠性,例如 let items = $state([{name: "test"}]);)。
总结:Svelte 的“魔法”依赖于其约定式结构。把 <script> 放回组件顶层,移除冗余 HTML 包裹,即可让变量自然暴露给模板——这是理解 Svelte 响应式模型的第一课,也是避免 90% 初学者编译错误的基石。
相关文章
- Vimeo官网网址入口 - 2026最新可用登录地址 07-11
- 头号禁区如何获取星空碎片 07-11
- mxpro画质怎么使用 07-11
- Taffyreclaimed45/ppt-agent skill 使用教程:安装入口、首次小稿和输出目录 07-11
- 异环房产系统介绍|异环峰林别墅最新价格与购房指南 07-11
- 洛克王国世界通用兑换码大全一览 07-11