浅谈Vue的加载顺序探讨


Posted in Javascript onOctober 25, 2017

在Vuejs 1.0版本中,如果父子组件进行配合,它们的生命周期执行具有如下特点:

1. created总是先父后子

生命周期函数created总是按照从父到子的顺序依次执行,但是兄弟之间没有严格按照这样的顺序执行,估计是采用了异步函数,不仅如此,子组件在父组件中的插入顺序也是随机的,并没有什么特别的规律。假定子组件的引用顺序如下:

<div class="container">
 <child-c1 v-ref:child1></child-c1>
 <child-c2 v-ref:child2></child-c2>
</div>

如果采用$children引用来获取所有的子组件,那么”child-c1”并不总是处于第一个位置,如下:

// 大多数时候判断会失败
 if(this.$children[0] === this.$refs.child1) {
  // 这里的代码很可能得不到执行机会
 }

2. ready的顺序更混乱

按照我的估计,父子组件的ready顺序应该是先子后父,这样才能保证组件完全加载完成,但从实践的实例来看,ready完全没有顺序,有时候是父组件先加载完成,也有时候是子组件先加载完成,所以在编程实践中,绝对不可以依赖他们的加载顺序。

3. 结论

在实践中,如果需要保障组件依次加载完成,绝对不可以依赖组件的生命顺序,也不能依赖父子组件的ready生命周期。

如何判断所有的子组件加载完成

在父子组件的配合使用中,尤其是配置信息与业务信息相分离的情况下,我们经常需要在所有的子组件加载完成后,再执行父组件的相关服务,以如下的组件结构为例:

<jq-grid :url="url" col-size="5" :sub-grid="true" ref="accountGrid" :on-ready="initGrid" :query="queryParams">
 <jq-col label="账号" name="username" width="75" :sortable="true"></jq-col>
 <jq-col label="用户名称" name="remarkName" width="75" :sortable="true"></jq-col>
 <jq-col label="创建时间" name="createTime" width="90">
 </jq-col>
</jq-grid>

在上面的例子中,我们需要组合子组件的配置信息,因此,只有所有的子组件加载完成,组合的配置信息才能准确完整。

所以,如果直接用mounted事件(1.0中为ready事件),则一定得到不正确的结果,为了解决此问题,我们不妨生命如下的数据结构与方法:

props : {
 colSize : {
  type : Number,
  default : 1
 }
}

data () {
 return {
  // 用于获取所有的子组件配置信息
  colModel : [],
  readySize : 0
 }
},

methods : {
 /**
  * 由子组件在加载完成时调用
  */
 addColModel () {
   this.readySize ++
   // 检查进度是否设置的colSize一致
   if(this.readySize == this.colSize) {
   // 这时候所有的子组件已加载完成
   } 
 }
}

通过设置配置项“colSize”与检查子组件调用的方法“addColModel”,我们可确定所有子组件加载完成的时刻(此时父组件有可能加载完成,也可能未加载完成),从而进行必要的配置信息整理操作。

但是在实际应用中,我们发现,如果子组件的数量较多时,会发生另外一种现象,子组件加载顺序会随机发生,如果要保证加载顺序与配置顺序一致,我们可以在子组件中加入“order”属性,如下,最新配置内容如下:

<jq-grid :url="url" col-size="8" :sub-grid="true" ref="hostGrid" :on-ready="initGrid" :query="queryParams">
 <jq-col order="1" label="名称" name="hostName" width="75" :sortable="true" ></jq-col>
 <jq-col order="2" label="主机型号" name="model" width="60" :sortable="true"></jq-col>
 <jq-col order="3" label="生产厂商" name="vendor" width="60" :sortable="true"></jq-col>
</jqgrid>

经过这样的处理,我们可以在所有子组件加载完成对其进行排序,如下:

// 由于Vue无法确定子元素的加载顺序,必须手动指定order
this.colModel.sort((a, b) => a.order - b.order)

结论

通过手动添加辅助变量与方法,可以获取子组件加载完成的时刻,从而执行整合性操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
javascript 设置文本框中焦点的位置
Nov 20 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
推荐一个自己用的封装好的javascript插件
Jan 29 Javascript
javaScript中push函数用法实例分析
Jun 08 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
Bootstrap布局方式详解
May 27 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
详解vue-loader在项目中是如何配置的
Jun 04 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 Javascript
通过vue刷新左侧菜单栏操作
Aug 06 Javascript
JavaScript模块模式实例详解
Oct 25 #Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 #Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 #Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
Oct 25 #Javascript
vue语法之拼接字符串的示例代码
Oct 25 #Javascript
浅谈Vue.nextTick 的实现方法
Oct 25 #Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
Oct 25 #Javascript
You might like
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
八年级数学教学反思
2014/01/31 职场文书
企业标语大全
2014/07/01 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
2015年信访工作总结
2015/04/07 职场文书