最近复习vue的时候遇到了一个很奇怪的问题,我们直接从实例中看:

<div id="app">
<child ref="child"></child>
</div>
<template id="child">
<ul>
<li v-for='a in arr'>{{a}}</li>
</ul>
</template>
<script src="../../node_modules/vue/dist/vue.js"></script>
<script>
let child = {
template:'#child',
mounted(){this.arr = [4,5,6]},//改变arr的值
data:function(){
return {arr:[1,2,3]};
},
}; let vm = new Vue({
el:'#app',
data:{
},
mounted(){
console.log(this.$refs.child.$el.innerHTML);//获取挂载到页面中的child子组件的innerHTML
},
components:{
child:child,
},
})
</script>

整个过程是这样的:

  • 我在子组件的mounted函数中,改变了arr的值,这会重新触发视图的渲染。
  • 然后我紧接着在父组件的mounted函数中获取子组件的innerHTML。

然而结果是这样的。

于是开始的苦苦的探索之路。

我们一起来分析一下整个的执行过程:

  • 首先,页面首次加载时,在子组件的mounted钩子函数之前,已经把$el挂载到了页面。
  • 然后执行子组件的mounted函数,将arr的值改变,导致页面的重新渲染。
  • 再然后执行父组件的mounted函数,将子组件的innerHTML打印出来。

答案就在页面的重新渲染这。执行完子组件的mounted函数后,会立即执行父组件的mounted函数。也就是说mounted之间的执行是同步执行的。但是我们的页面渲染是一个异步操作。也就是说在执行父组件的mounted方法时,页面还没有渲染完成,所以导致了打印结果的不一致性。

所幸的是vue给我们提供了一个全局的API:nextTick函数,该函数的功能是:

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

所以,我们对父组件的mounted做如下修改:

mounted(){
this.$nextTick(() => console.log(this.$refs.child.$el.innerHTML))
//console.log(this.$refs.child.$el.innerHTML)
},
//打印时异步渲染还未完成,所以打印的不是我们想要的结果.所以为保守起见,都为在执行mounted方法时添加一个this$nextTick()方法

大功告成,在实战中学习,在问题中学习就是这么爽。

从父子组件的mounted钩子的同步执行与页面的异步渲染看nextTick的用法的更多相关文章

  1. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...

  2. Vue 组件生命周期钩子

    Vue 组件生命周期钩子 # 1)一个组件从创建到销毁的整个过程,就称之为组件的生命周期 # 2)在组件创建到销毁的过程中,会出现众多关键的时间节点, 如: 组件要创建了.组件创建完毕了.组件数据渲染 ...

  3. Vue相关,vue父子组件生命周期执行顺序。

    一.实例代码 父组件: <template> <div id="parent"> <child></child> </div& ...

  4. 关于vue.js父子组件数据传递

    vue.js中使用props down,events up的原则进行父子组件间的通信,先来记录下props down,看个例子: <div id="app2"> < ...

  5. Vue父子组件生命周期执行顺序及钩子函数的个人理解

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  6. vue中子组件的created、mounted钩子中获取不到props中的值问题

    父子组件通信 这个官网很清楚,也很简单,父组件中使用v-bind绑定传送,子组件使用props接收即可 例如: 父组件中: <template> <div> <head- ...

  7. VUE生命周期中的钩子函数及父子组件的执行顺序

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  8. vue中父子组件钩子的执行顺序

    我们已经非常熟悉单个的vue组件的生命周期执行顺序了,但是,如果有嵌套组件,父子组件的生命周期的执行顺序是什么? 当父子组件在加载的时候,执行的先后顺序为 父beforeCreate -> 父c ...

  9. vue 使用同一组件,切换时不触发created、mounted钩子

    两个页面参数不同使用同一组件,默认情况下当这两个页面切换时并不会触发created或者mounted钩子. 方法一:通过watch $route的变化来做处理 watch: { $route() { ...

随机推荐

  1. C# Session操作

    Session.Abandon();//清除全部Session//清除某个SessionSession["UserName"] = null;Session.Remove(&quo ...

  2. RoadFlow ASP.NET Core工作流引擎IIS部署

    RoadFlow最新版本采用ASP.NET CORE2.1开发,部署步骤和.NET CORE部署一样,具体可参数ASP.NET CORE的部署方式. 1. 获取代码 首先从RoadFlow官网下载最新 ...

  3. 「HAOI2010」 弹飞绵羊

    题目链接 戳我 \(Solution\) \(LCT\)裸题 我们首先先新建一个节\(n+1\)点,表示被弹飞 对于点\(i,link(i,min(n+1,i+k_i))\) 再看看修改: 现在要将点 ...

  4. HTTP协议基础(未完待续)

    一.超文本传输协议 超文本传输协议(Hypertext Transfer Protocol,HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. 设计HT ...

  5. 自注意力机制(Self-attention Mechanism)——自然语言处理(NLP)

    近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中.随着注意力机制的深入研究,各式各样的attention被研究者们提出.在2017年6月google机 ...

  6. 阿里云ros实例

    模板文件 { "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { " ...

  7. [CentOS] 7 不执行文件 /etc/rc.d/rc.local

    chmod 0755 /etc/rc.local systemctl enable rc-local.service --now systemctl restart rc-local.service

  8. 「雅礼集训 2018 Day10」贪玩蓝月

    题目链接 题意分析 我们考虑维护两个栈 分别支持左边的插入删除以及右边的插入删除 然后对于两两个栈的我们需要用背包求出最优答案 注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注 ...

  9. 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I

    1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...

  10. Vultr VPS建站攻略 – 一键安装宝塔面板架设LNMP/LAMP Web环境

    我们选择VULTR VPS建站的还是比较多的,其主要原因在于商家的稳定,毕竟我们用来建站选择服务器价格考虑的不是主要的(当然VULTR价格也是比较便宜),最为主要的是因为VULTR商家比较稳定,而且多 ...