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读取ASP设定的COOKIE
Nov 24 Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
JavaScript中的异常捕捉介绍
Dec 31 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
Jul 04 Javascript
JavaScript数组方法大全(推荐)
Jul 05 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
Apr 25 Javascript
vue+axios 前端实现的常用拦截的代码示例
Aug 23 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 Javascript
JS面向对象编程实现的拖拽功能案例详解
Mar 03 Javascript
完美解决通过IP地址访问VUE项目的问题
Jul 18 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
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
python中私有函数调用方法解密
2016/04/29 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
Python Gitlab Api 使用方法
2019/08/28 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
keras tensorflow 实现在python下多进程运行
2020/02/06 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
营销主管自我评价怎么写
2013/09/19 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
邀请函的格式
2015/01/30 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL