浅谈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 相关文章推荐
云网广告中的代码,提示出错,大家找找
Nov 21 Javascript
学习ExtJS Window常用方法
Oct 07 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
Nov 14 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
Oct 15 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
vue中渐进过渡效果实现
Oct 27 Javascript
js和jquery中获取非行间样式
May 05 jQuery
jquery replace方法去空格
May 08 jQuery
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
微信小程序实现城市列表选择
Jun 05 Javascript
Vue的生命周期操作示例
Sep 17 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
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.2.2前后台公用类架构问题分析
2014/11/25 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
jquery构造器的实现代码小结
2011/05/16 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
Node.js实现简单管理系统
2019/09/23 Javascript
js实现烟花特效
2020/03/02 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
如何在pycharm中安装第三方包
2020/10/27 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
Linux如何为某个操作添加别名
2015/02/05 面试题
最新的咖啡店创业计划书
2013/12/30 职场文书
电子信息专业自荐书
2014/02/04 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
技术总监管理职责范本
2014/03/06 职场文书
社区健康教育工作方案
2014/06/03 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
自我工作评价范文
2015/03/06 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
党小组鉴定意见
2015/06/02 职场文书
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技