浅谈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 相关文章推荐
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
JQuery小知识
Oct 15 Javascript
JavaScript 程序编码规范
Nov 23 Javascript
javascript写的一个模拟阅读小说的程序
Apr 04 Javascript
JavaScript导出Excel实例详解
Nov 25 Javascript
node.js中的fs.chmodSync方法使用说明
Dec 18 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
Jan 08 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
基于Two.js实现星球环绕动画效果的示例
Nov 06 Javascript
Vue的轮播图组件实现方法
Mar 03 Javascript
微信小程序自定义可滑动日历界面
Dec 28 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 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
咖啡的化学
2021/03/03 咖啡文化
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
Yii2中datetime类的使用
2016/12/17 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
PDO::setAttribute讲解
2019/01/29 PHP
纯JS实现动态时间显示代码
2014/02/08 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
九种原生js动画效果
2015/11/11 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
临床医学应届生求职信
2013/11/06 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
秋季运动会开幕词
2015/01/28 职场文书
电影红河谷观后感
2015/06/11 职场文书
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
CentOS MySql8 远程连接实战
2022/04/19 MySQL