浅谈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 相关文章推荐
js截取函数(indexOf,join等)
Sep 01 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 Javascript
Angular用来控制元素的展示与否的原生指令介绍
Jan 07 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
浅谈React Native 中组件的生命周期
Sep 08 Javascript
微信小程序使用navigateTo数据传递的实例
Sep 26 Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
Aug 06 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 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
php启动时候提示PHP startup的解决方法
2013/05/07 PHP
PHP数据过滤的方法
2013/10/30 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PHP递归的三种常用方式
2019/02/28 PHP
javascript中的self和this用法小结
2014/02/08 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
点球小游戏python脚本
2018/05/22 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
python plotly画柱状图代码实例
2019/12/13 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
汽车维修专业个人求职信范文
2014/01/01 职场文书
美德少年事迹材料
2014/01/23 职场文书
清洁工岗位职责
2014/01/29 职场文书
网络信息安全承诺书
2014/03/26 职场文书
2014最新离职证明范本
2014/09/12 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书