Vue 3 中,组合式 API 的 setup() 函数确实先于选项式 API 的生命周期钩子执行

Vue3生命周期执行顺序解析:


  • 组合式API的setup()函数最先执行,其中注册的钩子函数(如onMounted)会先于选项式API的对应钩子(mounted)执行。
  • 组合式API钩子是回调注册机制,按注册顺序执行,而选项式API仍按传统顺序执行。

开发时建议统一使用组合式API,避免混合使用导致意外行为。


尤其注意在setup()中无法访问DOM,需在钩子回调中操作。


Vue3生命周期


在 Vue 3 中,组合式 API 的 setup() 函数确实先于选项式 API 的生命周期钩子执行。


这是一个很重要的执行顺序规则。


执行顺序对比


1. 完整的生命周期执行顺序

vue

复制代码
<script>
import { ref, onBeforeMount, onMounted } from 'vue'

export default {
  setup() {
    console.log('1. setup() 执行')
    
    onBeforeMount(() => {
      console.log('2. onBeforeMount() 执行')
    })
    
    onMounted(() => {
      console.log('4. onMounted() 执行')
    })
    
    return {}
  },
  
  beforeCreate() {
    console.log('3. beforeCreate() 执行')
  },
  
  created() {
    console.log('5. created() 执行')
  },
  
  beforeMount() {
    console.log('6. beforeMount() 执行')
  },
  
  mounted() {
    console.log('7. mounted() 执行')
  }
}
</script>

实际输出顺序:

复制代码
1. setup() 执行
2. onBeforeMount() 执行
3. beforeCreate() 执行
4. onMounted() 执行
5. created() 执行
6. beforeMount() 执行
7. mounted() 执行

2. 混合使用时的详细顺序

vue

复制代码
<script>
import { onBeforeMount, onMounted, onBeforeUpdate, onUpdated } from 'vue'

export default {
  setup() {
    console.log('1. setup()')
    
    onBeforeMount(() => {
      console.log('2. onBeforeMount')
    })
    
    onMounted(() => {
      console.log('4. onMounted')
    })
    
    onBeforeUpdate(() => {
      console.log('5. onBeforeUpdate')
    })
    
    onUpdated(() => {
      console.log('7. onUpdated')
    })
    
    return {}
  },
  
  beforeCreate() {
    console.log('3. beforeCreate')
  },
  
  created() {
    console.log('6. created')
  },
  
  beforeMount() {
    console.log('8. beforeMount')
  },
  
  mounted() {
    console.log('9. mounted')
  },
  
  beforeUpdate() {
    console.log('10. beforeUpdate')
  },
  
  updated() {
    console.log('11. updated')
  }
}
</script>

为什么会有这样的顺序?

Vue 3 内部执行流程:

  1. setup() 最先执行 - 这是组合式 API 的入口点

  2. 组合式 API 钩子注册 - onBeforeMount()、onMounted() 等在 setup() 中注册回调函数

  3. 选项式 API 钩子执行 - 按照传统的生命周期顺序执行


组合式 API 钩子 vs 选项式 API 钩子

javascript

复制代码
// 组合式 API - 注册回调(在 setup() 中)
onBeforeMount(() => {})  // 只是注册,不立即执行

// 选项式 API - 直接定义方法
beforeMount() {}  // 在相应阶段被 Vue 调用

重要注意事项

1. 在 <script setup> 中的情况

vue

复制代码
<script setup>
import { onMounted } from 'vue'

// 在 <script setup> 中,代码在编译后都会放在 setup() 中
console.log('setup 中的代码最先执行')

onMounted(() => {
  console.log('onMounted 回调')
})
</script>

<script>
// 普通 script 块中的代码会在 setup 之后执行
export default {
  mounted() {
    console.log('mounted 钩子')
  }
}
</script>

2. 异步组件的特殊情况

vue

复制代码
<script>
import { defineAsyncComponent } from 'vue'

const AsyncComponent = defineAsyncComponent(() => 
  import('./MyComponent.vue')
)

export default {
  components: {
    AsyncComponent
  },
  
  beforeCreate() {
    // 会在异步组件加载前执行
  }
}
</script>

3. 组合式 API 钩子的执行时机

vue

复制代码
<script>
import { onMounted } from 'vue'

export default {
  setup() {
    // 注册顺序影响执行顺序
    onMounted(() => {
      console.log('第一个 onMounted')
    })
    
    onMounted(() => {
      console.log('第二个 onMounted')
    })
    
    // 与选项式 API 混合时
    return {}
  },
  
  mounted() {
    console.log('选项式的 mounted')
    // 会在所有 onMounted 回调之后执行
  }
}
</script>

实际开发建议

推荐做法:

  1. 不要混合使用 - 尽量统一使用一种 API 风格

  2. 组合式 API 优先 - Vue 3 推荐使用组合式 API

  3. 迁移时注意顺序 - 从选项式迁移到组合式时,注意生命周期执行顺序的变化


常见问题:

vue

复制代码
<script>
import { ref, onMounted } from 'vue'

export default {
  setup() {
    const count = ref(0)
    
    onMounted(() => {
      console.log('DOM 已挂载,可以访问 DOM')
    })
    
    // ❌ 错误:在 setup() 中不能访问 DOM
    // console.log(document.getElementById('app'))
    
    return { count }
  },
  
  mounted() {
    // ✅ 正确:在这里可以访问 DOM
    console.log(this.$el)
  }
}
</script>

总结

  • 组合式 API 的 setup() 函数最先执行

  • 组合式 API 的生命周期钩子是注册回调函数,在对应阶段按注册顺序执行

  • 选项式 API 的生命周期钩子按传统顺序执行,但在组合式 API 之后

  • 了解这个顺序有助于避免在混合使用时出现意外行为

相关推荐
gc_229936 分钟前
Vue框架学习(1:环境搭建)
vue.js
我的div丢了肿么办6 小时前
element-plus表格使用:filter-method过滤导致出现无数据
前端·javascript·vue.js
贾公子6 小时前
AI 内容检测 API 接入实战——异步任务、幂等键与轮询的正确写法
vue.js
星光不问赶路人7 小时前
Vue 项目类型检查:深入理解 vue-tsc --build
前端·vue.js
WeiXin_DZbishe7 小时前
基于springboot装修风格选择系统的设计与开发-计算机毕设【课程设计】77964
java·vue.js·spring boot·后端·python·php·课程设计
雪碧聊技术8 小时前
Vue 一个页面中使用多个同类组件出现“串数据“现象?一个 key 就能解决
vue.js·v-show·一个页面使用多个相同组件·解决数据错乱·v-if、key
Java小卷10 小时前
Vue3 动态表单支持弹框组件
前端·vue.js·低代码
溪语流沙10 小时前
【Web全栈进阶】前端对接新契约:信封解包 + 统一错误处理
前端·vue.js·python·状态模式·fastapi
Q264336502311 小时前
【有源码】基于SpringBoot+Vue的居民健康体检与慢病干预管理系统-面向智慧医疗的体检预约与健康知识服务平台
java·vue.js·spring boot·mysql·毕业设计·javaweb·课程设计
雪芽蓝域zzs11 小时前
Vue导入方法三种方式对比
前端·javascript·vue.js