版权声明:出处http://blog.csdn.net/qq20004604

 

目录(?)[+]

 

本篇资料来于官方文档:

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

本文是在官方文档的基础上,更加细致的说明,代码更多更全。

简单来说,更适合新手阅读

 

(二十九)组件——动态组件

①简单来说:

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

②动态切换:

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

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

如示例代码:

  1. <div id="app">
  2. <button @click="toshow">点击让子组件显示</button>
  3. <component v-bind:is="which_to_show"></component>
  4. </div>
  5. <script>
  6. var vm = new Vue({
  7. el: '#app',
  8. data: {
  9. which_to_show: "first"
  10. },
  11. methods: {
  12. toshow: function () {   //切换组件显示
  13. var arr = ["first", "second", "third", ""];
  14. var index = arr.indexOf(this.which_to_show);
  15. if (index < 3) {
  16. this.which_to_show = arr[index + 1];
  17. } else {
  18. this.which_to_show = arr[0];
  19. }
  20. }
  21. },
  22. components: {
  23. first: { //第一个子组件
  24. template: "<div>这里是子组件1</div>"
  25. },
  26. second: { //第二个子组件
  27. template: "<div>这里是子组件2</div>"
  28. },
  29. third: { //第三个子组件
  30. template: "<div>这里是子组件3</div>"
  31. },
  32. }
  33. });
  34. </script>

说明:

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

③keep-alive

简单来说,被切换掉(非当前显示)的组件,是直接被移除了。

在父组件中查看this.$children属性,可以发现,当子组件存在时,该属性的length为1,而子组件不存在时,该属性的length是0(无法获取到子组件);

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

如代码:

  1. <div id="app">
  2. <button @click="toshow">点击让子组件显示</button>
  3. <component v-bind:is="which_to_show" keep-alive></component>
  4. </div>
  5. <script>
  6. var vm = new Vue({
  7. el: '#app',
  8. data: {
  9. which_to_show: "first"
  10. },
  11. methods: {
  12. toshow: function () {   //切换组件显示
  13. var arr = ["first", "second", "third", ""];
  14. var index = arr.indexOf(this.which_to_show);
  15. if (index < 3) {
  16. this.which_to_show = arr[index + 1];
  17. } else {
  18. this.which_to_show = arr[0];
  19. }
  20. console.log(this.$children);
  21. }
  22. },
  23. components: {
  24. first: { //第一个子组件
  25. template: "<div>这里是子组件1</div>"
  26. },
  27. second: { //第二个子组件
  28. template: "<div>这里是子组件2</div>"
  29. },
  30. third: { //第三个子组件
  31. template: "<div>这里是子组件3</div>"
  32. },
  33. }
  34. });
  35. </script>

说明:

初始情况下,vm.$children属性中只有一个元素(first组件),

点击按钮切换后,vm.$children属性中有两个元素,

再次切换后,则有三个元素(三个子组件都保留在内存中)。

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

④activate钩子

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

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

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

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

  1. <div id="app">
  2. <button @click="toshow">点击让子组件显示</button>
  3. <component v-bind:is="which_to_show"></component>
  4. </div>
  5. <script>
  6. var vm = new Vue({
  7. el: '#app',
  8. data: {
  9. which_to_show: "first"
  10. },
  11. methods: {
  12. toshow: function () {   //切换组件显示
  13. var arr = ["first", "second", "third", ""];
  14. var index = arr.indexOf(this.which_to_show);
  15. if (index < 3) {
  16. this.which_to_show = arr[index + 1];
  17. } else {
  18. this.which_to_show = arr[0];
  19. }
  20. console.log(this.$children);
  21. }
  22. },
  23. components: {
  24. first: { //第一个子组件
  25. template: "<div>这里是子组件1</div>"
  26. },
  27. second: { //第二个子组件
  28. template: "<div>这里是子组件2,这里是ajax后的内容:{{hello}}</div>",
  29. data: function () {
  30. return {
  31. hello: ""
  32. }
  33. },
  34. activate: function (done) { //执行这个参数时,才会切换组件
  35. var self = this;
  36. $.get("/test", function (data) {    //这个ajax我手动在服务器端设置延迟为2000ms,因此需要等待2秒后才会切换
  37. self.hello = data;
  38. done(); //ajax执行成功,切换组件
  39. })
  40. }
  41. },
  42. third: { //第三个子组件
  43. template: "<div>这里是子组件3</div>"
  44. }
  45. }
  46. });
  47. </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文件)

  1. <div id="app">
  2. <button @click="toshow">点击让子组件显示</button>
  3. <component v-bind:is="which_to_show" class="animated" transition="bounce" transition-mode="out-in"></component>
  4. </div>
  5. <script>
  6. Vue.transition("bounce", {
  7. enterClass: 'bounceInLeft',
  8. leaveClass: 'bounceOutRight'
  9. })
  10. var vm = new Vue({
  11. el: '#app',
  12. data: {
  13. which_to_show: "first"
  14. },
  15. methods: {
  16. toshow: function () {   //切换组件显示
  17. var arr = ["first", "second", "third", ""];
  18. var index = arr.indexOf(this.which_to_show);
  19. if (index < 3) {
  20. this.which_to_show = arr[index + 1];
  21. } else {
  22. this.which_to_show = arr[0];
  23. }
  24. }
  25. },
  26. components: {
  27. first: { //第一个子组件
  28. template: "<div>这里是子组件1</div>"
  29. },
  30. second: { //第二个子组件
  31. template: "<div>这里是子组件2,这里是ajax后的内容:{{hello}}</div>",
  32. data: function () {
  33. return {
  34. hello: ""
  35. }
  36. }
  37. },
  38. third: { //第三个子组件
  39. template: "<div>这里是子组件3</div>"
  40. }
  41. }
  42. });
  43. </script>

Vuejs——(12)组件——动态组件的更多相关文章

  1. vue组件---动态组件&异步组件

    (1)在动态组件上使用keep-alive 之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件.接下来简单回顾下 <component>元素是vue 里面的一个内置组件.在里面使 ...

  2. vue深入了解组件——动态组件&异步组件

    一.在动态组件上使用 keep-alive 我们之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件: <component v-bind:is="currentTabComp ...

  3. Vue组件-动态组件

    动态组件 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以让多个组件使用同一个挂载点,并动态切换: <div id="app6"& ...

  4. vue组件---动态组件之多标签页面

    首先看下效果图 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  5. 深入了解组件- -- 动态组件 & 异步组件

    gitHub地址:https://github.com/huangpna/vue_learn/example里面的lesson11 一 在动态组件上使用keep-alive 在这之前我们已经有学习过用 ...

  6. vue-learning:34 - component - 内置组件 - 动态组件component 和 is属性

    component动态组件 / is属性 让多个组件使用同一个挂载点,并动态切换,这就是动态组件. 必要条件: 组件标签使用<component></component> 动态 ...

  7. Vue 组件&组件之间的通信 之 template模板引用与动态组件的使用

    template模板引用 在component的template中书写大量的HTML元素很麻烦. Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的t ...

  8. vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件

    vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...

  9. vuejs动态组件给子组件传递数据

    vuejs动态组件给子组件传递数据 通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component> ...

随机推荐

  1. javac编译错误: 编码UTF8/GBK的不可映射字符

    转自:https://blog.csdn.net/leytton/article/details/52740171 Linux下为UTF-8编码,javac编译gbk编码的java文件时,容易出现“错 ...

  2. leetcode每日刷题计划-简单篇day3

    收到swe提前批面试hhh算是ep挂了的后续 努力刷题呀争取今年冲进去! Num 21 合并两个有序链表 Merge Two Sorted Lists 注意新开的链表用来输出结果的是ListNode ...

  3. android toolbar效果3

    Title居中,只有一个右边按钮 activity_main.xml: <?xml version="1.0" encoding="utf-8"?> ...

  4. gopath环境变量设置

    #在国内镜像下载二进制包 wget -c  http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz tar -C /usr/local ...

  5. python Django 无法获取post 参数问题

    对于 request.POST.get(name) 方式取值,需要 from 表单提交数据,如果 是ajax 提交数据,则需要做如下设置: 1.设置请求头,以from表单方式传值 'Content-T ...

  6. E0264 Unable to execute '"/usr/bin/codesign" ...'

    E0264 Unable to execute '"/usr/bin/codesign" ...' http://docwiki.embarcadero.com/RADStudio ...

  7. Spring中注入对象为NULL

    Java工程报错, java.lang.reflect.InvocationTargetException,网上搜索过后,发现是注入错误,通过调试发现,具体报错位置是某个dao层对象为null,进而引 ...

  8. js:作用域总结1

    先说几个概念: 1.js代码从上往下执行 2.变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window,window分两个模块,一个叫内存模块,一个叫运行 ...

  9. http建立连接过程

    参考:http://blog.csdn.net/wangjun5159/article/details/51510594

  10. hadoop的job执行在yarn中内存分配调节————Container [pid=108284,containerID=container_e19_1533108188813_12125_01_000002] is running beyond virtual memory limits. Current usage: 653.1 MB of 2 GB physical memory used

    实际遇到的真实问题,解决方法: 1.调整虚拟内存率yarn.nodemanager.vmem-pmem-ratio (这个hadoop默认是2.1) 2.调整map与reduce的在AM中的大小大于y ...