# setup script
<script setup>
是编译时语法糖,它允许使用组合式 API 定义 Vue 选项时提供更简洁和高效的语法。根据 Vue 文档,如果同时使用 SFC 和组合式 API,则建议使用这种语法。
通过使用 <script setup>
块,我们可以将组件逻辑压缩到单个块中,而无需显式的 setup() 函数。要使用 <script setup>
语法,我们只需引入 setup 属性分配给 <script />
块。
<script setup>
// ...
</script>
# 无 return 语句
使用 <script setup>
语法,我们不再需要在块的末尾定义 return
语句。在顶层声明的绑定(函数、变量、导入等)在模板中很容易访问和使用。
<template>
<div>
<p>Count: {{ count }}</p>
<p>Username: {{ state.username }}</p>
<button @click="increment">Increment Count</button>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from "vue";
const count = ref(0);
const state = reactive({ username: "John" });
const increment = () => {
count.value++;
};
onMounted(() => {
console.log("Component mounted");
});
</script>
# 没有本地注册的组件
在 <script setup>
块中自动识别和解析组件导入,而无需在 components 选项中显式声明组件。
<template>
<ButtonComponent />
</template>
<script setup>
import { ButtonComponent } from "./components/Button";
</script>
# defineProps()
可以使用 defineProps() 函数直接在 <script setup>
块中访问 props。
<template>
<button>{{ buttonText }}</button>
</template>
<script setup>
const { buttonText } = defineProps({
buttonText: String,
});
</script>
# defineEmits()
与 props 类似,通过在组件中使用 defineEmits() 函数,可以直接在 <script setup>
块中发出自定义事件。
<template>
<button @click="closeButton">Button Text</button>
</template>
<script setup>
const emit = defineEmits(["close"]);
const closeButton = () => emit("close");
</script>
# <script setup>
vs. setup()
对于具有大量返回选项和许多本地注册的子组件的较大组件,<script setup>
语法有助于删除大量样板代码,从而获得更清晰、更集中的组件定义,从而 有助于提高代码库的可读性和可维护性。
# 总结
使用 <script setup>
语法糖
- 更简洁的代码,更少的样板
- 能够使用纯 TypeScript 声明 prop 和发出的事件
- 更好的运行时性能
- 更好的 IDE 类型推导性能