动态组件 —— 2种方式实现动态组件的切换

动态组件适用于在不同组件之间进行动态切换。我使用过2种方法来实现:

(1)可以通过 Vue 的 <component> 元素加一个特殊的 is 特性来实现;

(2)通过v-if来进行条件渲染,同样能实现。

下面是2种实现方法的代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7     <title>动态组件的使用</title>
  8     <style>
  9         *{
 10             margin: 0;
 11             padding: 0;
 12         }
 13          [v-cloak]{   /*防止刷新时闪烁 */
 14             display: none;
 15         }
 16         #app{
 17             margin:100px 200px;
 18         }
 19         button{
 20             width:80px;
 21             height: 50px;
 22             line-height: 50px;
 23             font-size: 20px;
 24             outline: none;
 25             border-radius: 1px;
 26         }
 27         .isActive{
 28             background: #ccc;
 29         }
 30         .tab{
 31             width:600px;
 32             height: 200px;
 33             border:2px solid #ccc;
 34         }
 35     </style>
 36 </head>
 37 <body>
 38     <div id="app" v-cloak>
 39         <h3>方法1:使用v-if来实现组件之间动态切换</h3>
 40         <button
 41             v-for="tab in tabs"
 42             :key="tab"
 43             @click="setCurrentTab(tab)"
 44             :class="{isActive:currentTab === tab}">
 45             {{ tab }}
 46         </button>
 47         <tab-home v-if="currentTab == ‘Home‘"></tab-home>
 48         <tab-posts v-if="currentTab == ‘Posts‘"></tab-posts>
 49         <tab-article v-if="currentTab == ‘Article‘"></tab-article>
 50
 51         <h3 style="margin-top: 50px;">方法二:使用&ltcomponent  is="currentTabComponent"&gt&lt/component&gt‘来实现真正的动态组件切换</h3>
 52         <button
 53             v-for="tab in tabs"
 54             :key="tab"
 55             @click="setCurrentTab(tab)"
 56             :class="{isActive:currentTab === tab}">
 57             {{ tab }}
 58         </button>
 59         <component :is="currentTabComponent"></component>
 60     </div>
 61     <script src="../vue.min.js"></script>
 62     <script>
 63         //定义3个组件----全局注册组件
 64         Vue.component(‘tab-home‘,{
 65             template:`
 66                 <div class="tab">
 67                    Home组件
 68                 </div>
 69             `
 70         })
 71         Vue.component(‘tab-posts‘,{
 72             template:`
 73                 <div class="tab">
 74                     Posts组件
 75                 </div>
 76             `
 77         })
 78         Vue.component(‘tab-article‘,{
 79             template:`
 80                 <div class="tab">
 81                     Article组件
 82                 </div>
 83             `
 84         })
 85         var vm = new Vue({
 86             el:‘#app‘,
 87             data:{
 88                 currentTab:‘Home‘,
 89                 tabs:[‘Home‘,‘Posts‘,‘Article‘]
 90             },
 91             methods:{
 92                 setCurrentTab:function(val){  //设置当前选中的选项卡
 93                     this.currentTab = val;
 94                 }
 95             },
 96             computed:{
 97                 currentTabComponent:function(){
 98                     return ‘tab-‘ + this.currentTab.toLowerCase();  //设置当前选中选项卡对应的组件
 99                 }
100             }
101         })
102     </script>
103 </body>
104 </html>

结论:显然的是,使用Vue保留的元素<component :is="currentTabComponent"></component>更加方便高效

值得注意的是:在这里注册的组件都是全局注册的,在<component :is="currentTabComponent"></component>中,currentTabComponent表示已全局注册的组件名称。但是currentTabComponent可以支持2种情况:

(1)即上述所说的已注册的组件名称

(2)一个组件的选项对象

第(2)种情况的使用,如下所示:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>动态组件</title>
 8     <style>
 9         *{
10             margin: 0;
11             padding: 0;
12         }
13         [v-cloak]{
14             display:none;
15         }
16         #app{
17             margin: 100px 100px;
18         }
19         button{
20             width: 120px;
21             height: 50px;
22             font-size: 20px;
23             line-height: 50px;
24             border-radius: 1px;
25             outline: none;
26             cursor: pointer;
27         }
28         .isActive{
29             background: rgb(182, 179, 179);
30         }
31         .tab{
32             width:600px;
33             height: 200px;
34             border:2px solid #ccc;
35         }
36
37     </style>
38 </head>
39 <body>
40     <div id="app" v-cloak>
41         <button
42             v-for="tab in tabs"
43             :key="tab.name"
44             @click="setCurrentTab(tab)"
45             :class="{isActive:currentTab.name === tab.name}">
46             {{tab.name}}
47         </button>
48         <!-- 注意与使用组件名称的区别 -->
49         <component :is="currentTab.component" class="tab"></component>
50     </div>
51     <script src="../vue.min.js"></script>
52     <script>
53         //定义组件选项对象
54         var tabs = [
55             {
56                 name:"Home",
57                 component:{
58                     template:`<div class="tab">Home组件</div>`
59                 }
60             },
61             {
62                 name:"Posts",
63                 component:{
64                     template:`<div class="tab">Posts组件</div>`
65                 }
66             },
67             {
68                 name:"Article",
69                 component:{
70                     template:`<div class="tab">Article组件</div>`
71                 }
72             }
73         ];
74         var vm = new Vue({
75             el:‘#app‘,
76             data:{
77                 tabs:tabs,
78                 currentTab:tabs[0]
79             },
80             methods:{
81                 setCurrentTab:function(val){
82                     this.currentTab = val;
83                 }
84             }
85         })
86     </script>
87 </body>
88 </html>

原文地址:https://www.cnblogs.com/sherryStudy/p/dynamic_component.html

时间: 2024-08-05 20:32:02

动态组件 —— 2种方式实现动态组件的切换的相关文章

使用Net.Mail、CDO组件、JMail组件三种方式发送邮件

原文:使用Net.Mail.CDO组件.JMail组件三种方式发送邮件 一.使用Net.Mail 需要服务器认证,大部分服务器端口为25. 1 /// <summary> 2 /// 用MailMessage通过需要认证的SMTP服务器发送邮件,可以发送附件 3 /// </summary> 4 /// <param name="frmAddress">发件箱地址,例:[email protected]</param> 5 /// <

ExtJs--04--window窗口属性说明并两种方式添加子组件

Ext.onReady(function(){ /** extjs 容器组件的layout属性可以设置它的显示风格,以下视情况选用: - Auto - **默认** - hbox //水平方向排列 - vbox //垂直方向排列 1)absolute:在容器内部,根据指定的坐标定位显示. 2)accordion:手风琴效果. 3)anchor: 注意以下几点: 1.容器内的组件要么指定宽度,要么在anchor中同时指定高/宽 2.anchor值通常只能为负值(指非百分比值),正值没有意义. 3.

自定义flex组件使用标签方式添加子组件

一般情况下,当我们写了一个继承自flex组件并往里面添加了子组件,然后想用标签等方式添加子组件时候报错了,那如何解决这一的问题,自定义组件代码如下: <?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">

extjs组件添加事件监听的三种方式 http://blog.sina.com.cn/s/blog_48d7f92901011cfn.html

extjs对组件添加监听的三种方式 在定义组件的配置时设置 如代码中所示: Java代码 xtype : 'textarea', name : 'dataSetField', labelSeparator:'', fieldLabel:'', hideLabel: true, allowBlank: true, height: mainPanelHeight*0.8, anchor:'99%', listeners:{'blur':function(){ alert(1); }} 对组件变量通过

js动态引入的四种方式

index.html [html] view plaincopy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta content="text/html;charset=utf-8" http-equiv=&qu

java的动态代理的两种方式和spring的aop面向切面编程的对比

java动态代理的两种方式 使用动态代理的好处:可以进行类的功能的加强,同时减少耦合和代码的冗余,耦合的意思是不用吧加强的部分写到各个实现类里面,冗余的意思是如果对每个实现类加强的部分是一样的,通过一个代理类即可实现 基于jdk的动态代理 通过jdk中自带的Proxy类进行动态的代理,Proxy创建动态代理对象的时候要传入三个参数,第一个是classloader,第二个是interfaces,第三个是代理类实现的方法 要求:代理的是一个接口,必须至少有一个实现类 创建接口的代码: /** * a

增强一个Java类中的某个方法的几种方式

      * 一种方式:继承的方式.  * 能够控制这个类的构造的时候,才可以使用继承. Connection是一个接口,实现类不确定(由各厂商提供),无法使用此方法     * 二种方式:装饰者模式方式.         * 包装对象和被包装的对象都要实现相同的接口.         * 包装的对象中需要获得到被包装对象的引用.         ***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.     * 三种方式:动态代理的方式.         

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content

动态加载dex的两种方式

DexClassLoader 加载的类是没有组件生命周期的,也就是说即使DexClassLoader通过对dex的动态加载完成了对组件的加载,当系统启动该组件时,还会出现加载类失败的异常.有两种方式可以解决上面出现的问题: 方法一:http://blog.csdn.net/androidsecurity/article/details/8809542,更改系统的classloader使其为自定义的加载器. 特点:两个dex具有明显的分割线,第一个dex只起启动作用,后面不会出现第一个dex的类加