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 相关文章推荐
zShowBox 图片放大展示jquery版 兼容性
Sep 24 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
JS组件Bootstrap实现弹出框效果代码
Apr 26 Javascript
Js遍历键值对形式对象或Map形式的方法
Aug 08 Javascript
jQuery.datatables.js插件用法及api实例详解
Oct 28 Javascript
jQuery生成假加载动画效果
Dec 01 Javascript
Js实现中国公民身份证号码有效性验证实例代码
May 03 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
layui 设置table 行的高度方法
Aug 17 Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
微信小程序中的上拉、下拉菜单功能
Mar 13 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
vue+express+jwt持久化登录的方法
2019/06/14 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
简单谈谈Python中的闭包
2016/11/30 Python
python 获取url中的参数列表实例
2018/12/18 Python
python打包成so文件过程解析
2019/09/28 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
火车来了教学反思
2014/02/11 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
为Java项目添加Redis缓存的方法
2021/05/18 Redis
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript