浅谈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 相关文章推荐
Javascript 获取字符串字节数的多种方法
Jun 02 Javascript
解决IE6的PNG透明JS插件使用介绍
Apr 17 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
Aug 18 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
js判断出两个字符串最大子串的函数实现方法
Nov 01 Javascript
vue与TypeScript集成配置最简教程(推荐)
Oct 17 Javascript
深入浅析AngularJs模版与v-bind
Jul 06 Javascript
详解如何在微信小程序中愉快地使用sass
Jul 30 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
Sep 23 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
Jun 16 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
php实现webservice实例
2014/11/06 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
python 读取数据库并绘图的实例
2019/12/03 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
施华洛世奇天猫官方旗舰店:SWAROVSKI
2017/04/17 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
公益活动策划方案
2014/01/09 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android