AD7490与PIC18F97J60构建高精度数据采集系统
2026/7/8 9:36:29
深入理解 Vue 生命周期:created 与 mounted 的核心差异与实战指南
created和mounted是 Vue 中最常用、也最容易混淆的两个生命周期钩子。很多人会问:“我到底应该把接口请求、DOM 操作、初始化逻辑放在哪里?”
下面从原理、执行时机、可用性、实战场景四个维度给你彻底讲透。
| 维度 | created | mounted |
|---|---|---|
| 执行时机 | 实例创建完成后,DOM 未生成 | 实例挂载到 DOM 后,DOM 已真实渲染 |
| 能否访问 DOM | 不能(e l 为 u n d e f i n e d , el 为 undefined,el为undefined,refs 为空) | 可以(e l 、 el、el、refs、document.querySelector 均可用) |
| 数据响应式 | 已完成(data、props、computed、watch 均可用) | 已完成 |
| 子组件状态 | 子组件还未创建 | 子组件已完成 mounted |
| 典型用途 | 数据初始化、接口请求、事件总线监听 | DOM 操作、第三方库初始化、获取元素尺寸 |
| 是否可多次触发 | 首次创建时触发一次 | 首次创建时触发一次(keep-alive 组件切换时不触发) |
| Vue 3 Composition API 对应 | setup()(最早期) | onMounted() |
一句话总结:
父组件 created ↓ 子组件 created ↓ 子组件 mounted ↓ 父组件 mountedcreated → mounted,之后切换只会触发activated / deactivated,不会再走 created/mounted。<script> export default { data() { return { list: [] } }, async created() { // 推荐在这里发请求:数据准备好后立即渲染 const res = await fetch('/api/list') this.list = res.data }, mounted() { // 这里才能安全操作 DOM this.$refs.chart && this.initEcharts() // 或 document.getElementById('box').style.height = '500px' } } </script><script setup> import { ref, onMounted } from 'vue' const list = ref([]) const chartRef = ref(null) // created 对应:setup() 本身就是最早阶段 const fetchData = async () => { const res = await fetch('/api/list') list.value = res.data } fetchData() // 直接在 setup 中执行 // mounted 对应:onMounted onMounted(() => { if (chartRef.value) { initEcharts(chartRef.value) } }) </script>created中做的(优先级最高):mounted中做的:this.$nextTick()仍然常用,但 mounted 之后已经不需要了错误1:在 created 中操作 DOM
created(){this.$refs.box.style.color='red'// 无效!$refs 为空}错误2:把所有请求都放在 mounted
错误3:在 mounted 中忘记清理副作用
mounted(){this.timer=setInterval(...)// 必须在 beforeUnmount 中 clearInterval}错误4:依赖子组件 DOM
// useEcharts.jsexportfunctionuseEcharts(){constchartRef=ref(null)onMounted(()=>{...})return{chartRef}}useMounted、onClickOutside等工具函数已帮你处理好时机created在服务端也会执行,mounted仅客户端执行(注意区分)掌握了这两个钩子的区别,你就真正理解了 Vue “数据驱动视图”的本质。
想继续深入哪个部分?
随时告诉我,我可以继续展开!