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 已更新。
相关推荐
FFF-X1 分钟前
前端字符串模糊匹配实现:精准匹配 + Levenshtein 编辑距离兜底
前端
Hi_kenyon11 分钟前
Ref和Reactive都是什么时候使用?
前端·javascript·vue.js
止观止32 分钟前
深入理解 interface vs type:终结之争
前端·typescript
css趣多多42 分钟前
vue环境变量
前端
RFCEO44 分钟前
前端编程 课程十五、:CSS核心基础3:文字+段落样式
前端·css·文字+段落样式·css文本样式·美化页面文本内容·演示动画说明·单行文字垂直居中技
摇滚侠44 分钟前
【程序员入门系列】jQuery 零基础入门到精通!Jquery 选择器 API
前端·javascript·jquery
im_AMBER44 分钟前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
源力祁老师1 小时前
深入解析 Odoo 中 default_get 方法的功能
java·服务器·前端
sleeppingfrog2 小时前
zebra打印机实现前端打印
前端
摇滚侠2 小时前
前端判断不等于 undefined 不等于 null 的方法
前端