Vue 3 工程化实战:用 script setup 把组件写得更短更稳
test12026-09-253 次阅读
为什么是 script setup
Vue 3 的组合式 API 最初用 setup() 函数承载逻辑,但要在模板里用就得手动 return 每一个变量,组件一大就变成一堆 return 语句。script setup 是编译时的语法糖:写在里面的顶层绑定自动暴露给模板,类型推导也天然更好。
基础写法对比
传统 setup 函数:
import { ref, computed } from "vue";
export default {
setup() {
const count = ref(0);
const double = computed(() => count.value * 2);
const inc = () => count.value++;
return { count, double, inc };
},
};
等价的 script setup,不需要 return:
<script setup lang="ts">
import { ref, computed } from "vue";
const count = ref(0);
const double = computed(() => count.value * 2);
const inc = () => count.value++;
</script>
<template>
<button @click="inc">{{ count }} / {{ double }}</button>
</template>
props 与 emit 的编译器宏
defineProps 和 defineEmits 是编译器宏,不需要 import,且能完整推导类型:
<script setup lang="ts">
interface Props {
title: string;
size?: "sm" | "md" | "lg";
}
const props = withDefaults(defineProps<Props>(), {
size: "md",
});
const emit = defineEmits<{
(e: "confirm", value: number): void;
}>();
function onTap() {
emit("confirm", 1);
}
</script>
组件自动命名与代码组织
在 script setup 里,导入的组件直接在模板使用,不需要 components 注册;文件名会作为 devtools 显示的组件名,建议用多词命名。当逻辑变重时,把可复用的组合式逻辑抽到 useXxx 函数,组件里只剩装配:
<script setup lang="ts">
import { useUserList } from "@/composables/useUserList";
import { usePagination } from "@/composables/usePagination";
const { users, loading } = useUserList();
const { page, next } = usePagination();
</script>
几个容易踩的坑
- defineProps / defineEmits / defineExpose 是编译期宏,不能出现在条件分支或函数内部。
- 需要父组件通过 ref 访问子组件内部时,必须用 defineExpose 显式暴露,否则默认不暴露。
- 顶层 await 在 script setup 中合法,组件会被自动当作异步依赖处理,配合 Suspense 使用。
- 类型声明优先用 defineProps<接口> 而不是运行时 props 对象,这样能拿到端到端类型推导。
script setup 把"样板代码"基本压到了最低:没有 return、没有 components 注册、props/emits 自带类型。它在编译阶段就完成了模板绑定分析,运行期没有额外开销,是 Vue 3 项目的默认推荐写法。
T
test1
文章作者
为什么是 script setup Vue 3 的组合式 API 最初用 setup() 函数承载逻辑,但要在模板里用...
- 分类
- 技术
- 发布时间
- 2026-09-25
- 字数
- 约 1857 字
- 阅读
- 3 次
