news 2026/5/13 5:11:35

Vue3 语法进阶:从<script setup>语法糖 到 <script>传统方式的平滑过渡指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3 语法进阶:从<script setup>语法糖 到 <script>传统方式的平滑过渡指南

目录

前言

一、最直观的对比:结构差异

1、语法糖写法(你熟悉的)

2、传统写法(公司项目常见)

二、响应式数据的定义

三、方法的定义与使用

四、生命周期钩子

五、Props 与 Emits

1、语法糖写法

2、传统写法

六、完整示例对比

1、你习惯的写法(语法糖)

2、公司项目的写法(传统)

七、快速转换口诀

八、常见错误与解决

九、总结

写在最后


前言

在 Vue3 开发中,<script setup>语法糖凭借其简洁、直观的写法,已经成为大多数开发者的首选。但当你加入一个新团队,或者维护一个老项目时,可能会遇到使用传统<script>写法的代码。

面对export default { setup() { ... } }这样的结构,很多习惯了语法糖的同学会感到困惑:为什么还要手动 return?props 怎么定义?生命周期还能用吗?

本文将用对比学习的方式,帮你快速掌握传统<script>的核心写法,让你无缝切换两种开发模式。


一、最直观的对比:结构差异

1、语法糖写法(你熟悉的)

<script setup> import { ref } from 'vue' const count = ref(0) const increment = () => count.value++ // 自动暴露给模板,无需 return </script>

2、传统写法(公司项目常见)

<script> import { ref } from 'vue' export default { setup() { const count = ref(0) const increment = () => count.value++ // 必须手动 return,模板才能使用 return { count, increment } } } </script>

核心差异:语法糖自动 return 所有顶层绑定,传统写法需要你手动 return。


二、响应式数据的定义

场景<script setup>传统<script>
ref 定义const num = ref(0)同上,但要 return
reactive 定义const state = reactive({})同上,但要 return
模板中使用直接{{ num }}直接{{ num }}

示例代码:

<!-- 传统写法 --> <script> import { ref, reactive } from 'vue' export default { setup() { const count = ref(10) const user = reactive({ name: 'Alice', age: 18 }) return { count, user } } } </script> <template> <p>{{ count }}</p> <p>{{ user.name }}</p> </template>

三、方法的定义与使用

异步方法、普通方法写法完全一致,唯一区别仍然是return

<script> import { ref } from 'vue' import { getUserInfo } from '@/api/user' export default { setup() { const data = ref(null) const loading = ref(false) const fetchData = async () => { loading.value = true const res = await getUserInfo() data.value = res.data loading.value = false } // 方法也需要 return return { data, loading, fetchData } } } </script>

四、生命周期钩子

生命周期钩子的用法完全一致,因为都是在setup()函数内部调用。

<script> import { onMounted, onUnmounted } from 'vue' export default { setup() { onMounted(() => { console.log('组件已挂载') }) onUnmounted(() => { console.log('组件即将卸载') }) return {} } } </script>

五、Props 与 Emits

这是最容易混淆的地方,对比来看更清晰。

1、语法糖写法

<script setup> const props = defineProps(['title', 'id']) const emit = defineEmits(['update', 'close']) emit('update', 'new value') </script>

2、传统写法

<script> export default { props: ['title', 'id'], emits: ['update', 'close'], setup(props, { emit }) { emit('update', 'new value') return {} } } </script>

注意props是响应式对象,不要解构它,否则会失去响应性。


六、完整示例对比

1、你习惯的写法(语法糖)

<script setup> import { ref, onMounted } from 'vue' import { getArticleList } from '@/api/article' const articles = ref([]) const loading = ref(false) const loadArticles = async () => { loading.value = true const res = await getArticleList() articles.value = res.data loading.value = false } onMounted(() => { loadArticles() }) </script>

2、公司项目的写法(传统)

<script> import { ref, onMounted } from 'vue' import { getArticleList } from '@/api/article' export default { setup() { const articles = ref([]) const loading = ref(false) const loadArticles = async () => { loading.value = true const res = await getArticleList() articles.value = res.data loading.value = false } onMounted(() => { loadArticles() }) // 关键:把所有要在模板中用的变量和函数都 return return { articles, loading, loadArticles } } } </script>

七、快速转换口诀

  1. 所有代码放进setup() { } ,用到的变量/函数必须return出去

  2. props 单独写在props选项中

  3. emits 单独写在emits选项中

  4. 生命周期钩子用法不变


八、常见错误与解决

错误现象原因解决方案
模板中显示 undefined变量没 return添加到 return 对象中
props 不更新解构了 props直接使用props.xxx
emit 不生效没声明 emits添加emits: ['事件名']
this 报错想用 this.xxx直接用变量名,没有 this

九、总结

特性<script setup>传统<script>
代码量更少稍多(需要 return)
学习曲线平缓稍陡
组件实例无 this无 this(setup 中也没有)
适用场景新项目、组件库老项目、复杂配置

核心思想:两种写法本质是一样的,传统写法只是把语法糖“自动做的事”变成了“手动做”。理解setup()函数 +return这个机制,你就能轻松看懂任何传统写法的 Vue 组件。


写在最后

如果你刚接触传统写法,不用慌。先把return { }里的内容当作“模板能用的东西清单”,看不懂的代码就找这个清单。多写几次就能完全掌握。

希望这篇文章能帮助你快速适应公司项目的代码风格。如果有任何疑问,欢迎在评论区留言交流!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 14:19:05

Pyfa:EVE Online舰船配置专家的离线工具箱

Pyfa&#xff1a;EVE Online舰船配置专家的离线工具箱 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa Pyfa&#xff08;Python Fitting Assistant&#xff09;是一款专…

作者头像 李华
网站建设 2026/4/9 14:18:24

终极指南:在电脑上完美运行任天堂Switch游戏的完整方案

终极指南&#xff1a;在电脑上完美运行任天堂Switch游戏的完整方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想要在个人电脑上体验《塞尔达传说&#xff1a;王国之泪》的广阔世界…

作者头像 李华
网站建设 2026/4/9 14:17:07

Obsidian插件本地化解决方案:打破语言壁垒的技术实践

Obsidian插件本地化解决方案&#xff1a;打破语言壁垒的技术实践 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 核心痛点分析&#xff1a;多语言环境下的知识管理困境 你是否也曾遇到这样的情况&#xff1a;安装了一款功…

作者头像 李华
网站建设 2026/4/9 14:12:57

别只看报价!安卓APP加固价格与效果的权衡指南

当你在咨询安卓APP加固服务时&#xff0c;最常遇到的情况是&#xff1a;A公司报价几万&#xff0c;B公司报价几千&#xff0c;甚至还有免费的开源工具。面对巨大的价格差异&#xff0c;你可能会陷入选择困难。贵的就一定好吗&#xff1f;便宜的会不会有坑&#xff1f; 这篇文章…

作者头像 李华