Vue 中mounted 生命周期钩子的执行时机和 v-for 的渲染顺序

1. mounted 的执行时机

mounted 是组件生命周期中DOM 挂载完成后触发的钩子,具体指:

  • 组件的模板已经被编译为真实 DOM,并插入到页面中。
  • 此时可以通过 this.$el 访问到组件的根 DOM 元素,也能通过 documentthis.$refs 获取到已渲染的 DOM 节点。

但注意:mounted 仅保证组件自身的 DOM 结构挂载完成,并不直接等同于 "所有子元素 / 指令渲染完成"。

2. v-formounted 的关系

v-for 用于循环渲染列表,其执行逻辑是:

核心逻辑:mounted 仅与组件自身挂载相关,而 v-for 的渲染时机取决于数据源的更新时机。

  • 在组件渲染阶段(beforeMount 之后、mounted 之前),Vue 会根据 v-for 的数据源(如数组)生成对应的 DOM 节点,并插入到父元素中。

  • mounted 触发时,v-for 循环生成的 DOM 已经存在于页面中 (只要数据源在 mounted 之前就已确定)。

  • <template> <div>

    <p v-for="(item, index) in list" :key="index">{{ item }}</p>

    </div>

    </template>

    <script>

    export default {

    data() {

    return {

    list: 'a', 'b', 'c' // 初始就有数据

    }

    },

    mounted() {

    // 此时 v-for 生成的 3 个 <p> 标签已经存在于 DOM 中

    console.log(this.$el.querySelectorAll('p').length) // 输出 3

    }

    }

    </script>

  • 此时 mounted 中可以正常获取到 v-for 渲染的 DOM,因为数据源 list 在组件初始化时就已确定,v-formounted 前已完成渲染。

    3. 可能出现的 "不同步" 情况

    如果 v-for 的数据源是异步获取 的(如在 created 中发请求),则会出现 mounted 执行时 v-for 尚未渲染的情况:

  • <script>

    export default {

    data() {

    return {

    list: \[\] // 初始为空

    }

    },

    created() {

    // 异步获取数据(1 秒后返回)

    setTimeout(() => {

    this.list = 'a', 'b', 'c'

    }, 1000)

    },

    mounted() {

    // 此时 list 还是空数组,v-for 未渲染任何 DOM

    console.log(this.$el.querySelectorAll('p').length) // 输出 0

    }

    }

    </script>

  • 原因:mounted 在组件挂载后立即执行(约在代码运行后 0ms),而 v-for 的数据源在 1000ms 后才更新,因此 mounted 中无法获取到异步数据渲染的 DOM。

总结

  • v-for 的数据源是同步数据 (初始就有),mounted 执行时 v-for 已经渲染完成,可直接操作 DOM。
  • v-for 的数据源是异步数据mounted 执行时可能尚未渲染,需用 $nextTickwatch 确保 DOM 已更新。
相关推荐
铁皮饭盒14 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端
lichenyang4531 天前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen1 天前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒1 天前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
free351 天前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
暴走的小呆1 天前
Vue 2 中 Object 的变化侦测:从 getter/setter 到 Dep、Watcher、Observer
vue.js
奇奇怪怪的1 天前
Embedding 模型 10+ 横向评测
前端
陈广亮1 天前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰1 天前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程