浅谈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 相关文章推荐
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
node.js中的http.request.end方法使用说明
Dec 10 Javascript
Jquery中CSS选择器用法分析
Feb 10 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
Sep 01 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
javascript中json基础知识详解
Jan 19 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
记一次vue-webpack项目优化实践详解
Feb 17 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
Element Input输入框的使用方法
Jul 26 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
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
Yii中表单用法实例详解
2016/01/05 PHP
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
微信小程序如何获取用户手机号
2018/01/26 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
python使用any判断一个对象是否为空的方法
2014/11/19 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python如何重载模块实例解析
2018/01/25 Python
numpy返回array中元素的index方法
2018/06/27 Python
python画折线图的程序
2018/07/26 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python的列表List求均值和中位数实例
2020/03/03 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
BASIC HOUSE官方旗舰店:韩国著名的服装品牌
2018/09/27 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
协议书格式
2014/04/23 职场文书
项目工作说明书
2014/07/29 职场文书
好人好事演讲稿
2014/09/01 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
主持人开幕词
2015/01/29 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书