Vue 3 单文件组件中 script、template 和 style 怎么协同工作

千伟吖_2905

千伟吖_2905

2026-09-23

497人浏览

原创

vue 3单文件组件三部分分工明确:script是“大脑”,负责初始化响应式数据、逻辑与生命周期;template是“骨架”,基于script状态编译为渲染函数并生成虚拟dom;style是“皮肤”,编译时提取、挂载后注入,实现作用域隔离样式。

vue 3 单文件组件中 script、template 和 style 怎么协同工作

Vue 3 单文件组件中,scripttemplatestyle 三者不是孤立存在的,而是按明确分工与执行时序协同完成组件的构建、渲染与样式应用。

script 是组件的“大脑”:定义行为与状态

<script>(尤其是 <code>&lt;script setup&gt;)负责初始化响应式数据、声明方法、注册生命周期钩子、处理逻辑依赖。它在编译阶段被解析,在运行时最先执行——所有模板中用到的变量(如 &lt;code&gt;title、&lt;code&gt;count)、事件处理器(如 &lt;code&gt;increment)都必须在此提前声明。没有它,template 就是无源之水。&lt;/script&gt;&lt;/p&gt;&lt;div class=&quot;aritcle_card flexRow artxards&quot;&gt; &lt;div class=&quot;artcardd flexRow&quot;&gt; &lt;a class=&quot;aritcle_card_img&quot; rel=&quot;nofollow&quot; href=&quot;/xiazai/skill1140&quot; title=&quot;Vue&quot;&gt;&lt;img src=&quot;https://img.php.cn/upload/skill/000/000/081/178797612947731.jpg&quot; alt=&quot;Vue&quot; onerror=&quot;this.onerror='';this.src='/static/lhimages/moren/morentu.png'&quot; &gt;&lt;/a&gt; &lt;div class=&quot;aritcle_card_info flexColumn&quot;&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;/xiazai/skill1140&quot; title=&quot;Vue&quot; class=&quot;overflowclass&quot;&gt;Vue&lt;/a&gt; &lt;p class=&quot;overflowclass&quot;&gt;避免 Vue 常见错误——响应式陷阱、ref 与 reactive 区别、计算属性时机及 Composition API 陷阱。&lt;/p&gt; &lt;/div&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;/xiazai/skill1140&quot; title=&quot;Vue&quot; class=&quot;aritcle_card_btn flexRow flexcenter&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;下载&lt;/span&gt; &lt;/a&gt; &lt;/div&gt; &lt;/div&gt; &lt;ul&gt; &lt;li&gt;数据必须先定义再使用:例如 &lt;code&gt;const count = ref(0)</code> 要出现在 <code>{{ count }}</code> 渲染之前</li> <li>导入依赖需同步完成:<code>import { ref, onMounted } from 'vue'</code> 必须在脚本顶部,否则后续调用会报错</li> <li>生命周期钩子决定关键时机:比如 <code>onMounted</code> 里才能安全访问真实 DOM 或读取计算样式</li> </ul> <h3>template 是组件的“骨架”:基于 script 输出视图</h3> <p><template> 不是独立运行的 HTML,而是 Vue 的模板语法载体。它在 <script> 执行后,被编译为渲染函数,再结合 script 提供的响应式状态生成虚拟 DOM。它的内容完全依赖 script 中暴露的标识符——插值、指令、事件绑定都指向 script 定义的内容。</script>

  • 支持多根节点(Vue 3 特性),无需强制包裹 div
  • 模板内不能直接写 JS 表达式逻辑(如 iffor),需交由 script 中的 computed 或方法处理
  • 指令如 v-if@click 的值,本质是访问 script 中定义的响应式变量或函数

style 是组件的“皮肤”:作用域隔离且延迟应用