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

Vue3中setup运行时机介绍

在 Vue3 中,直接写在 <script setup>...</script> 中的代码运行时机可以分为以下几个关键阶段:


一、执行顺序层级

Vue ScriptSetup Lifecycle 解析 <script setup> 注册响应式变量/组合函数 触发 beforeCreate 执行模板编译 触发 created 执行 mounted Vue ScriptSetup Lifecycle

二、具体运行阶段

1. 组件实例初始化前
  • 执行时机:在 Vue 实例化过程中,早于 beforeCreate 生命周期钩子
  • 典型行为
    <script setup>
    // 以下代码会先于 beforeCreate 执行
    import { ref } from 'vue'
    const count = ref(0) // 响应式变量初始化
    console.log('ScriptSetup 执行') // 会在此阶段输出
    </script>
    
2. 响应式系统构建
  • 依赖收集:所有在 <script setup> 中声明的 ref/reactive 变量会被立即初始化
  • 示例验证
    <script setup>
    const message = ref('Hello')
    console.log(message.value) // 输出 "Hello"
    </script>
    
3. 生命周期钩子对比
代码位置执行时机示例
<script setup>beforeCreate 之前初始化响应式变量、导入模块
setup() 函数beforeCreate 之前(等同于 <script setup>
onMounted 钩子组件挂载完成后访问 DOM 元素
created 钩子beforeCreate 之后不能访问 DOM

三、异步操作的特殊处理

1. 异步代码执行时机
<script setup>
// 以下异步代码会立即执行(在实例化前)
const fetchData = async () => {const res = await fetch('/api/data')data.value = await res.json()
}
fetchData() // 立即发起请求
</script>
2. 与生命周期的关系
  • 请求会在 beforeCreate 前发起,但响应处理会在组件挂载后完成
  • 典型场景
    <script setup>
    import { ref, onMounted } from 'vue'const data = ref(null)// 立即执行的异步请求
    fetchData().then(res => {data.value = res // 在 mounted 钩子前可能已赋值
    })onMounted(() => {console.log(data.value) // 可能已有值(取决于请求速度)
    })
    </script>
    

四、与选项式 API 的对比

特性<script setup>选项式 API (setup() 函数)
执行时机beforeCreatebeforeCreate
响应式声明ref/reactive 直接声明需要返回对象
代码组织更简洁,无 this 上下文需要 this 访问实例
编译优化Tree-shaking 友好需要手动优化

五、关键注意事项

1. 不要访问 DOM
<script setup>
// ❌ 错误:此时 DOM 尚未创建
const element = document.getElementById('app')
</script>
2. 异步数据获取
<script setup>
// ✅ 正确:在 setup 阶段发起请求
const data = ref(null)fetch('/api/data').then(res => {data.value = res.json()
})
</script>
3. 响应式变量初始化
<script setup>
// ✅ 正确:响应式变量在实例化前初始化
const count = ref(0)
</script>

六、底层原理

  1. 编译阶段

    • Vue 编译器将 <script setup> 转换为 setup() 函数
    • 所有顶层代码被提升到 setup() 最顶部
  2. 运行时阶段

    • 在组件实例化流程中,先执行 <script setup> 代码
    • 再依次触发 beforeCreatecreatedbeforeMount 等生命周期

总结

  • 运行时机<script setup> 中的代码在 组件实例化前 执行(早于 beforeCreate
  • 核心特性
    • 响应式变量立即初始化
    • 顶级代码立即执行
    • 无法访问 DOM 元素
  • 最佳实践
    • 用于初始化数据、导入模块、注册组合函数
    • 异步操作需注意执行顺序
    • 避免在此阶段直接操作 DOM

相关文章:

  • FC7300 DMA MCAL 配置引导
  • 经典循环神经网络变体
  • 将已打包好的aar文件,上传到 Coding 的 Maven 仓库
  • Windows11安装rockerMq5.0+以及springboot集成rockerMq
  • iOS SwiftUI的具体运用实例(SwiftUI库的运用)
  • 大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN
  • 应用层DDoS防护:从请求特征到行为链分析
  • Day 27 函数专题2 装饰器
  • 高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案
  • Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优
  • Java + 鸿蒙双引擎:ZKmall开源商城如何定义下一代B2C商城技术标准?
  • 【Linux网络】数据链路层
  • 在服务器上安装AlphaFold2遇到的问题(2)
  • #跟着若城学鸿蒙# web篇-获取定位
  • 质量管理工程师面试总结
  • React文件上传组件封装全攻略
  • React Flow 节点属性详解:类型、样式与自定义技巧
  • python打卡day27
  • 组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
  • Jenkins的流水线执行shell脚本执行jar命令后项目未启动未输出日志问题处理
  • 七猫征文大赛颁出112万奖金,非遗题材作品斩获金奖
  • 长期吃太饱,身体会发生什么变化?
  • 既是工具又是食物,可食用机器人开启舌尖上的新科技
  • 政企共同发力:多地密集部署外贸企业抢抓90天政策窗口期
  • “三个集中”之后:图说浦东新区28次撤乡并镇
  • 杞支雅男评《1517》|放眼世界,立足德国