Vuejs第十二篇之动态组件全面解析


Posted in Javascript onSeptember 09, 2016

什么是组件?

组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

本篇资料是小编参考官方文档的基础上整理的一篇更加细致的说明,代码更多更全,非常适合新手学习。

官方文档:

http://cn.vuejs.org/guide/components.html#u52A8_u6001_u7EC4_u4EF6

动态组件介绍如下所示:

①简单来说:

就是几个组件放在一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示。

②动态切换:

在挂载点使用component标签,然后使用v-bind:is=”组件名”,会自动去找匹配的组件名,如果没有,则不显示;

改变挂载的组件,只需要修改is指令的值即可。

如示例代码:

<div id="app"> 
<button @click="toshow">点击让子组件显示</button> 
<component v-bind:is="which_to_show"></component> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
which_to_show: "first" 
}, 
methods: { 
toshow: function () { //切换组件显示 
var arr = ["first", "second", "third", ""]; 
var index = arr.indexOf(this.which_to_show); 
if (index < 3) { 
this.which_to_show = arr[index + 1]; 
} else { 
this.which_to_show = arr[0]; 
} 
} 
}, 
components: { 
first: { //第一个子组件 
template: "<div>这里是子组件1</div>" 
}, 
second: { //第二个子组件 
template: "<div>这里是子组件2</div>" 
}, 
third: { //第三个子组件 
template: "<div>这里是子组件3</div>" 
}, 
} 
}); 
</script>

说明:

点击父组件的按钮,会自动切换显示某一个子组件(根据which_to_show这个变量的值来决定)。

③keep-alive

简单来说,被切换掉(非当前显示)的组件,是直接被移除了。
在父组件中查看this.$children属性,可以发现,当子组件存在时,该属性的length为1,而子组件不存在时,该属性的length是0(无法获取到子组件);

假如需要子组件在切换后,依然需要他保留在内存中,避免下次出现的时候重新渲染。那么就应该在component标签中添加keep-alive属性。

如代码:

<div id="app"> 
<button @click="toshow">点击让子组件显示</button> 
<component v-bind:is="which_to_show" keep-alive></component> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
which_to_show: "first" 
}, 
methods: { 
toshow: function () { //切换组件显示 
var arr = ["first", "second", "third", ""]; 
var index = arr.indexOf(this.which_to_show); 
if (index < 3) { 
this.which_to_show = arr[index + 1]; 
} else { 
this.which_to_show = arr[0]; 
} 
console.log(this.$children); 
} 
}, 
components: { 
first: { //第一个子组件 
template: "<div>这里是子组件1</div>" 
}, 
second: { //第二个子组件 
template: "<div>这里是子组件2</div>" 
}, 
third: { //第三个子组件 
template: "<div>这里是子组件3</div>" 
}, 
} 
}); 
</script>

说明:

初始情况下,vm.$children属性中只有一个元素(first组件),点击按钮切换后,vm.$children属性中有两个元素,再次切换后,则有三个元素(三个子组件都保留在内存中)。

之后无论如何切换,将一直保持有三个元素。

④activate钩子

简单来说,他是延迟加载。

例如,在发起ajax请求时,会需要等待一些时间,假如我们需要在ajax请求完成后,再进行加载,那么就需要用到activate钩子了。

具体用法来说,activate是和template、data等属性平级的一个属性,形式是一个函数,函数里默认有一个参数,而这个参数是一个函数,执行这个函数时,才会切换组件。

为了证明他的延迟加载性,在服务器端我设置当发起某个ajax请求时,会延迟2秒才返回内容,因此,第一次切换组件2时,需要等待2秒才会成功切换:

<div id="app"> 
<button @click="toshow">点击让子组件显示</button> 
<component v-bind:is="which_to_show"></component> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
which_to_show: "first" 
}, 
methods: { 
toshow: function () { //切换组件显示 
var arr = ["first", "second", "third", ""]; 
var index = arr.indexOf(this.which_to_show); 
if (index < 3) { 
this.which_to_show = arr[index + 1]; 
} else { 
this.which_to_show = arr[0]; 
} 
console.log(this.$children); 
} 
}, 
components: { 
first: { //第一个子组件 
template: "<div>这里是子组件1</div>" 
}, 
second: { //第二个子组件 
template: "<div>这里是子组件2,这里是ajax后的内容:{{hello}}</div>", 
data: function () { 
return { 
hello: "" 
} 
}, 
activate: function (done) { //执行这个参数时,才会切换组件 
var self = this; 
$.get("/test", function (data) { //这个ajax我手动在服务器端设置延迟为2000ms,因此需要等待2秒后才会切换 
self.hello = data; 
done(); //ajax执行成功,切换组件 
}) 
} 
}, 
third: { //第三个子组件 
template: "<div>这里是子组件3</div>" 
} 
} 
}); 
</script>

代码效果:

【1】第一次切换到组件2时,需要等待2秒后才能显示(因为发起ajax);

【2】在有keep-alive的情况下,第二次或之后切换到组件2时,无需等待;但ajax内容,需要在第一次发起ajax两秒后才会显示;

【3】在无keep-alive的情况下(切换掉后没有保存在内存中),第二次切换到组件2时,依然需要等待。

【4】等待时,不影响再次切换(即等待组件2的时候,再次点击切换,可以直接切换到组件3);

说明:

【1】只有在第一次渲染组件时,才会执行activate,且该函数只会执行一次(在第一次组件出现的时候延迟组件出现)

【2】没有keep-alive时,每次切换组件出现都是重新渲染(因为之前隐藏时执行了destroy过程),因此会执行activate方法。

⑤transition-mode过渡模式

简单来说,动态组件切换时,让其出现动画效果。(还记不记得在过渡那一节的说明,过渡适用于动态组件)
默认是进入和退出一起完成;(可能造成进入的内容出现在退出内容的下方,这个下方指y轴方面偏下的,等退出完毕后,进入的才会出现在正确的位置);

transition-mode=”out-in”时,动画是先出后进;
transition-mode=”in-out”时,动画是先进后出(同默认情况容易出现的问题);

示例代码:(使用自定义过渡名和animate.css文件)

<div id="app"> 
<button @click="toshow">点击让子组件显示</button> 
<component v-bind:is="which_to_show" class="animated" transition="bounce" transition-mode="out-in"></component> 
</div> 
<script> 
Vue.transition("bounce", { 
enterClass: 'bounceInLeft', 
leaveClass: 'bounceOutRight' 
}) 
var vm = new Vue({ 
el: '#app', 
data: { 
which_to_show: "first" 
}, 
methods: { 
toshow: function () { //切换组件显示 
var arr = ["first", "second", "third", ""]; 
var index = arr.indexOf(this.which_to_show); 
if (index < 3) { 
this.which_to_show = arr[index + 1]; 
} else { 
this.which_to_show = arr[0]; 
} 
} 
}, 
components: { 
first: { //第一个子组件 
template: "<div>这里是子组件1</div>" 
}, 
second: { //第二个子组件 
template: "<div>这里是子组件2,这里是ajax后的内容:{{hello}}</div>", 
data: function () { 
return { 
hello: "" 
} 
} 
}, 
third: { //第三个子组件 
template: "<div>这里是子组件3</div>" 
} 
} 
}); 
</script>

以上所述是小编给大家介绍的Vuejs第十二篇之动态组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript打印网页部分内容的脚本
Nov 17 Javascript
javascript getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 Javascript
JS继承用法实例分析
Feb 05 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
Immutable 在 JavaScript 中的应用
May 02 Javascript
JS中使用正则表达式g模式和非g模式的区别
Apr 01 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
Jul 17 jQuery
移动端效果之IndexList详解
Oct 20 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
微信小程序的授权实现过程解析
Aug 02 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 #Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 #Javascript
jQuery子元素过滤选择器用法示例
Sep 09 #Javascript
老生常谈JQuery data方法的使用
Sep 09 #Javascript
Vuejs第十一篇组件之slot内容分发实例详解
Sep 09 #Javascript
jQuery内容过滤选择器用法示例
Sep 09 #Javascript
Vue.js动态组件解析
Sep 09 #Javascript
You might like
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
php中in_array函数用法探究
2014/11/25 PHP
php实现上传图片保存到数据库的方法
2015/02/11 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
PHP安全上传图片的方法
2015/03/21 PHP
3种php生成唯一id的方法
2015/11/23 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
js中function()使用方法
2013/12/24 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
vue 实现的树形菜的实例代码
2018/03/19 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python日志模块logbook使用方法
2019/09/19 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
学校做一个有道德的人活动方案
2014/08/23 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL