当前位置: 首页 > 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
http://www.xdnf.cn/news/481699.html

相关文章:

  • MyBatis—动态 SQL
  • 网安面试经(1)
  • MySQL8.x新特性:与mysql5.x的版本区别
  • SpringBoot--Bean管理详解
  • 3D生成新突破:阶跃星辰Step1X-3D开源,可控性大幅提升
  • python + flask 做一个图床
  • ThinkPad X250电池换电池芯(理论技术储备)
  • windows系统中下载好node无法使用npm
  • STM32控制电机
  • duxapp 2025-03-29 更新 编译结束的复制逻辑等
  • MySQL的触发器
  • ubuntu 20.04 更改国内镜像源-阿里源 确保可用
  • 适合学校使用的桌面信息看板,具有倒计时、桌面时钟、课程表、天气预报、自动新闻联播、定时关机、消息通知栏、随机点名等功能。
  • CMU-15445(4)——PROJECT#1-BufferPoolManager-Task#2
  • 【软件工程】符号执行与约束求解缺陷检测方法
  • MySQL性能优化
  • RAG-MCP:基于检索增强生成的大模型工具选择优化框架
  • Cross-Site Scripting(XSS)
  • AT9850B—单北斗导航定位芯片
  • 【leetcode】94. 二叉树的中序遍历
  • 逻辑回归(二分类)
  • Linux的日志管理
  • 青少年ctf平台应急响应-应急响应2
  • 在vue3中使用Cesium的保姆教程
  • 【2025年软考中级】第一章1.5 输入输出技术(外设)
  • 代码随想录第51天|岛屿数量(深搜)、岛屿数量(广搜)、岛屿的最大面积
  • 2025年Ai写PPT工具推荐,这5款Ai工具可以一键生成专业PPT
  • Java—— 方法引用 : :
  • 【第76例】IPD流程实战:华为业务流程架构BPA进化的4个阶段
  • ROS2学习(3)------架构概述