Vuejs——(12)组件——动态组件
版权声明:出处http://blog.csdn.net/qq20004604
本篇资料来于官方文档:
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——(12)组件——动态组件的更多相关文章
- vue组件---动态组件&异步组件
(1)在动态组件上使用keep-alive 之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件.接下来简单回顾下 <component>元素是vue 里面的一个内置组件.在里面使 ...
- vue深入了解组件——动态组件&异步组件
一.在动态组件上使用 keep-alive 我们之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件: <component v-bind:is="currentTabComp ...
- Vue组件-动态组件
动态组件 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以让多个组件使用同一个挂载点,并动态切换: <div id="app6"& ...
- vue组件---动态组件之多标签页面
首先看下效果图 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...
- 深入了解组件- -- 动态组件 & 异步组件
gitHub地址:https://github.com/huangpna/vue_learn/example里面的lesson11 一 在动态组件上使用keep-alive 在这之前我们已经有学习过用 ...
- vue-learning:34 - component - 内置组件 - 动态组件component 和 is属性
component动态组件 / is属性 让多个组件使用同一个挂载点,并动态切换,这就是动态组件. 必要条件: 组件标签使用<component></component> 动态 ...
- Vue 组件&组件之间的通信 之 template模板引用与动态组件的使用
template模板引用 在component的template中书写大量的HTML元素很麻烦. Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的t ...
- vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件
vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...
- vuejs动态组件给子组件传递数据
vuejs动态组件给子组件传递数据 通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component> ...
随机推荐
- java中将表单转换为PDF
经过网上搜索大概有三种方式:PDF模板数据填充,html代码转换pdf,借用wkhtmltopdf工具 一 .PDF模板数据填充 1.新建word,在word中做出和表单一样的布局的空表单,然后另存为 ...
- Java内存泄漏的几种可能
Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发 ...
- jqGrid基本用法与示例
转自:https://chuanlu.iteye.com/blog/1953544 一.jqGrid的基本用法 1.html页面 <!DOCTYPE html PUBLIC "-//W ...
- PHP json_encode 文本形式数字下标数组导致下标丢失
$arr = array( '0'=>'a','1'=>'b','2'=>'c','3'=>'d' ); echo json_encode($arr); 但是结果是 [&quo ...
- Jquery中的 Deferred分析
参考:https://www.idaima.com/a/1627.html http://www.cnblogs.com/aaronjs/p/3356505.html 未完!
- 吴裕雄 python深度学习与实践(16)
import struct import numpy as np import matplotlib.pyplot as plt dateMat = np.ones((7,7)) kernel = n ...
- e1000
http://blog.csdn.net/sdulibh/article/details/41826221 http://blog.csdn.net/evenness/article/details/ ...
- Linux shell read 解析
read是一个重要的bash命令,它用于从键盘或标准输入中读取文本,我们可以用read以交互的方式读取来自用户的输入,不过read能做的可远不止这些,当从键盘读取用户输入的时候,只有按下回车键才标志输 ...
- Python: 下载底层由Python2转Python3环境更新手记
谨记录运行环境改变过程中所碰到的坑. 下载底层运行环境由Python2移至Python3所遇到的问题及处理方法: 1.所引的第三方组件,基本都有替代支持:msvcr90.dll不再需要,有则报错2.引 ...
- project1
知识漏洞 有空就默写一下-.- [概念] 要好好理解并且背下来记住 MVC要分开,Servlet里面不处理计算的逻辑,只有调用函数(是不是变量传进来以后,调用都不能有呢?) clear map不能直 ...