当前位置: 首页 > news >正文

<script setup> 和在 <script> 中使用 setup() 函数有什么区别

在 Vue 3 的 Composition API 中,使用 <script setup> 和在 <script> 中使用 setup() 函数有本质区别。

script setup 语法糖写法

<script setup>是一种语法糖的写法。

<script setup>
// 组合式 API 代码直接写在这里
import { ref } from 'vue'
const count = ref(0)
</script>
  • 特点:

    编译器宏支持:自动暴露顶层变量(无需 return)

    更简洁:减少样板代码

    自动注册组件:导入的组件可直接在模板使用

    编译器优化:更好的性能(编译时转换)

    支持顶层 await:

<script setup>
const data = await fetchData() // 直接使用
</script>
  • 特殊宏:

    defineProps() / defineEmits():定义 props/emits

    defineExpose():暴露组件属性

    useSlots() / useAttrs():获取 slots/attrs

2. setup() 函数(传统写法)

<script>
export default {setup() {// 需要手动返回模板使用的数据const count = ref(0)return { count }}
}
</script>
  • 特点:

    显式返回:必须 return 模板需要的变量

    手动处理上下文:通过参数获取 props/context

    无法使用顶层 await:需在异步函数内使用

    兼容 Options API:可与 data/methods 等混用

整理如下:

  • 特性 script setup | setup() 函数
  • 代码量: 更简洁(减少 ~30% 代码)| 需要显式 return
  • 变量暴露: 顶层变量自动暴露 | 需手动返回
  • 组件注册: 自动注册导入的组件 | 需在 components 选项声明
  • Props/Emits 定义: 通过 defineProps/defineEmits 宏 | 通过函数参数 props/context 获取
  • TypeScript 支持: 更好的类型推断 | 类型声明较复杂
  • 顶层 await: 支持 | 不支持
  • 上下文访问: 通过 useAttrs()/useSlots() | 通过 setup(props, context) 参数

代码示例对比

使用 script setup

<script setup>
import { ref } from 'vue'
import ChildComp from './ChildComp.vue'const count = ref(0)
defineProps({ msg: String })
</script><template><ChildComp @click="count++" />{{ msg }}: {{ count }}
</template>

使用 setup() 函数

<script>
import { ref } from 'vue'
import ChildComp from './ChildComp.vue'export default {components: { ChildComp },props: ['msg'],setup(props) {const count = ref(0)return { count } // 必须返回}
}
</script><template><ChildComp @click="count++" />{{ msg }}: {{ count }}
</template>

何时选择?
推荐 <script setup>
新项目首选,更简洁、性能更好,官方推荐写法。

考虑 setup() 函数:
需要兼容 Options API 或特殊逻辑(如动态组件名)。

注意:<script setup> 是编译时语法糖,最终会被转换为标准的 setup() 函数。

http://www.xdnf.cn/news/1057609.html

相关文章:

  • vite的分包
  • 使用 React-i18next 在 TypeScript 的 Next.js 应用中实现国际化
  • ARM单片机启动流程(一)(万字解析,纯干货分享)
  • CVPR 2025最佳论文详解|VGGT:纯前馈Transformer架构,3D几何感知「大一统」模型来了!
  • 精益数据分析(108/126):媒体网站用户参与时间优化与分享行为解析
  • 【Unity笔记】Unity URP 渲染中的灯光数量设置— 场景、使用方法与渲染原理详解
  • Python 列表与元组的性能差异:选择合适的数据结构
  • 人机交互的趋势判断-范式革命的推动力量
  • SCRM客户关系管理软件的界面设计原则:提升用户体验与交互效率
  • 【Mysql】MySQL的MVCC及实现原理,核心目标与全流程图解
  • 获取ip地址安全吗?如何获取静态ip地址隔离ip
  • 常见航空数码相机
  • 基于SpringBoot的民宿管理平台-037
  • 【Linux指南】文件内容查看与文本处理
  • 操作系统引导和虚拟机(包含os结构,选择题0~1题无大题)
  • 编译链接实战(27)动态库实现变了,可执行程序需要重新编译吗
  • 互联网思维概念和落地
  • 如何写一个简单的python类class
  • 影视剧学经典系列-梁祝-《闲情赋》
  • 如何让DeepSeek-R1-Distill-Qwen-32B支持Function calling
  • 学习昇腾开发的第三天--将服务器连接网络
  • 【锂电池剩余寿命预测】XGBoost锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 外观模式Facade Pattern
  • 02- 六自由度串联机械臂(ABB)运动学分析
  • C++面向对象编程:简洁入门
  • RPG29:制作ui基础
  • YoloV12改进策略:Block改进|MKP,多尺度卷积核级联结构,增强感受野适应性|即插即用|AAAI 2025
  • 命令模式Command Pattern
  • 多线程并发编程硬核指南:从互斥锁到生产者模型的全场景实战与原理揭秘
  • C++(初阶)(二十一)——unordered_set和unordered_map