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

template模板引用

在component的template中书写大量的HTML元素很麻烦。 Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的template属性上;

 

示例:

由图可知自定义组件的count的值是自增的,是独立的,互不影响。

vue代码:

<template id="my-template">
        
        <div>
            <h2>{{name}}</h2>
            <button  @click="count++">{{count}}</button>
            <ul>
                
                <li v-for="item in numArray">{{item}}</li>
            </ul>
            
        </div>
    </template>
    <script type="text/javascript" src="../js/vue.js" ></script>
    <script>
        
        new Vue({
            
            
            
            
            components:{
                    "my-component-b":{
                        template:'#my-template',
                        data(){
                            return{
                                name:'欢迎来到perfect*的博客园_01',
                                numArray:[1,2,3,4,5],
                                count:0
                            }
                        }
                        
                        
                    }
                }
                
            
            
        }).$mount('div');
    </script>

html:

<body>
        <div>
        <my-component-b></my-component-b><!--可以把my-component-b看做一个对象-->
        <my-component-b></my-component-b><!--可以把my-component-b看做一个对象-->
        
        </div>
    </body>

 

动态组件:

在一个元素上挂载多个组件,根据不同状态进行切换的时候,可以使用动态组件;

动态组件的使用:

需要使用内置组件<component></component>,根据 :is 的值决定显示哪个组件,:is的值是要显示的组件id;

 

示例:

初始效果:

初始代码:

<!DOCTYPE html>
  <html>
      <head>
          <meta charset="UTF-8">
          <title>动态组件</title>
      </head>
      <body>
          <div>
          <my-component-a></my-component-a>
         <my-component-b></my-component-b>
         <my-component-c></my-component-c>
         
         </div>
     </body>
     
     
     <script type="text/javascript" src="../js/vue.js" ></script>
     <script>
         
         new Vue({
             
             
             
             
             components:{
                     "my-component-a":{
                         template:'<h1>欢迎来到perfect*的博客园</h1>'
                         
                     },
                     
                     "my-component-b":{
                         template:"<a href='https://www.cnblogs.com/jiguiyan/'> perfect*的博客园 </a>"
                         
                     },
                     "my-component-c":{
                         template:"<p>perfect*</p>"
                         
                     },
                     
                     
                 }
                 
             
             
         }).$mount('div');
     </script>
 </html>

动态组件

 

现在的需求:

需要在页面中只显示一个,并通过三个button来进进行控制它们的显示

 

 

 

 

由效果图可知,页面默认显示my-component-a标签的内容

 

vue代码:

<script>
        
        new Vue({
            data:{
                selectName:'my-component-a'
                
            },
            
            
            
            
            components:{
                    "my-component-a":{
                        template:'<h1>欢迎来到perfect*的博客园</h1>'
                        
                    },
                    
                    "my-component-b":{
                        template:"<a href='https://www.cnblogs.com/jiguiyan/'> perfect*的博客园 </a>"
                        
                    },
                    "my-component-c":{
                        template:"<p>perfect*</p>"
                        
                    },
                    
                    
                }
                
            
            
        }).$mount('div');
    </script>

html:

    <div>
            <button @click="selectName='my-component-a' ">a</button>
            <button @click="selectName='my-component-b' ">b</button>
            <button @click="selectName='my-component-c' ">c</button>
        <!--<my-component-a></my-component-a>
        <my-component-b></my-component-b>
        <my-component-c></my-component-c>-->
        
        <component :is="selectName"></component>
        
        </div>

代码注意:

 

总的代码:

<!DOCTYPE html>
  <html>
      <head>
          <meta charset="UTF-8">
          <title>动态组件</title>
      </head>
      <body>
          <div>
              <button @click="selectName='my-component-a' ">a</button>
             <button @click="selectName='my-component-b' ">b</button>
             <button @click="selectName='my-component-c' ">c</button>
         <!--<my-component-a></my-component-a>
         <my-component-b></my-component-b>
         <my-component-c></my-component-c>-->
         
         <component :is="selectName"></component>
         
         </div>
     </body>
     
     
     <script type="text/javascript" src="../js/vue.js" ></script>
     <script>
         
         new Vue({
             data:{
                 selectName:'my-component-a'
                 
             },
             
             
             
             
             components:{
                     "my-component-a":{
                         template:'<h1>欢迎来到perfect*的博客园</h1>'
                         
                     },
                     
                     "my-component-b":{
                         template:"<a href='https://www.cnblogs.com/jiguiyan/'> perfect*的博客园 </a>"
                         
                     },
                     "my-component-c":{
                         template:"<p>perfect*</p>"
                         
                     },
                     
                     
                 }
                 
             
             
         }).$mount('div');
     </script>
 </html>

动态组件

 

 

动态组件结合keep-alive

keep-alive:将非活动的组件缓存起来

include - 字符串或正则表达式。只有名称匹配的组件会被缓存。

exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。

max - 数字。最多可以缓存多少组件实例。

示例:

初始效果:

由图可以看出每一次点击button调用的值不一样,因此引入了keep-alive来进行缓存

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>动态组件</title>
    </head>
    <body>
        <div>
            <button @click="selectName='my-component-a' ">a</button>
            <button @click="selectName='my-component-b' ">b</button>
            <button @click="selectName='my-component-c' ">c</button>
        <!--<my-component-a></my-component-a>
        <my-component-b></my-component-b>
        <my-component-c></my-component-c>-->
        
        
        <component :is="selectName"></component>
        
        </div>
    </body>
    
    
    <script type="text/javascript" src="../js/vue.js" ></script>
    <script>
        
        new Vue({
            data:{
                selectName:'my-component-a'
                
            },
            
            
            
            
            components:{
                    "my-component-a":{
                        template:'<h1>A:{{num}}</h1>',
                        data(){
                            
                            return{
                                num:Math.ceil(Math.random()*100)
                            }
                        }
                        
                    },
                    
                    "my-component-b":{
                        template:"<a href='#'>B:{{num}} </a>",
                        data(){
                            
                            return{
                                num:Math.ceil(Math.random()*100)
                            }
                        }
                        
                    },
                    "my-component-c":{
                        template:"<p>C:{{num}}</p>",
                        data(){
                            
                            return{
                                num:Math.ceil(Math.random()*100)
                            }
                        }
                        
                    },
                    
                    
                }
                
            
            
        }).$mount('div');
    </script>
</html>

初始代码

 

 

从图中可以看出 a:1 b:84 c: 86的值一直没发生改变,说明已经被缓存了。

 

include属性:

只有a的值被缓存了

<keep-alive include="my-component-a"><!--只有a的值被缓存了-->
            
            
            
            <component :is="selectName"></component>
        </keep-alive>

可以通过数组进行多个:

效果:

缓存了a和b的值

<keep-alive :include="['my-component-a','my-component-b']"><!--a,b的值被缓存了-->
            
            <component :is="selectName"></component>
          </keep-alive>

同理exclude 属性测试方法和include一样,只是exclude表示的是除了那一个不缓存

 

max属性:最多可以缓存多少组件实例

效果图:

 

 

<keep-alive :max='2'><!--最多只能缓存abc三个值中的其中两个-->
            <component :is="selectName"></component>
          </keep-alive>

 总的代码:

<!DOCTYPE html>
  <html>
      <head>
          <meta charset="UTF-8">
          <title>动态组件</title>
      </head>
      <body>
          <div>
              <button @click="selectName='my-component-a' ">a</button>
             <button @click="selectName='my-component-b' ">b</button>
             <button @click="selectName='my-component-c' ">c</button>
         <!--<my-component-a></my-component-a>
         <my-component-b></my-component-b>
         <my-component-c></my-component-c>-->
         <!--<keep-alive include="my-component-a"><!--只有a的值被缓存了-->
             
             <!--<keep-alive :include="['my-component-a','my-component-b']"><!--a,b的值被缓存了-->
             <keep-alive :max='2'><!--最多只能缓存abc三个值中的其中两个-->
             <component :is="selectName"></component>
           </keep-alive>
         
         
         
         </div>
     </body>
     
     
     <script type="text/javascript" src="../js/vue.js" ></script>
     <script>
         
         new Vue({
             data:{
                 selectName:'my-component-a'
                 
             },
             
             
             
             
             components:{
                     "my-component-a":{
                         template:'<h1>A:{{num}}</h1>',
                         data(){
                            
                             return{
                                 num:Math.ceil(Math.random()*100)
                             }
                         }
                         
                     },
                     
                     "my-component-b":{
                         template:"<a href='#'>B:{{num}} </a>",
                         data(){
                             
                             return{
                                 num:Math.ceil(Math.random()*100)
                             }
                         }
                         
                     },
                     "my-component-c":{
                         template:"<p>C:{{num}}</p>",
                         data(){
                             
                             return{
                                 num:Math.ceil(Math.random()*100)
                             }
                         }
                        
                     },
                     
                     
                 }
                 
             
             
         }).$mount('div');
     </script>
 </html>

动态组件结合keep-alive

详细介绍官网网址:

https://cn.vuejs.org/v2/api/#keep-alive

 

转载于:https://www.cnblogs.com/jiguiyan/p/10757984.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue组件和父组件之间通信可以通过props和emit实现,而Vue组件和兄弟组件之间通信可以通过VueX、Event Bus或者provide/inject实现。 1. props和emit 子组件通过props接受父组件传递的数据,然后通过emit触发一个事件告诉父组件发生了什么事情。 父组件: ``` <template> <div> <child-component :message="parentMessage" @send-message="handleMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello, child!' } }, methods: { handleMessage(message) { console.log(message); } } } </script> ``` 子组件: ``` <template> <div> <p>{{ message }}</p> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { props: { message: String }, methods: { sendMessage() { this.$emit('send-message', 'Hello, parent!'); } } } </script> ``` 2. VueX VueX是Vue的官方状态管理库,可以用来管理全局状态,并在组件之间共享数据。 兄弟组件: ``` <script> export default { computed: { count() { return this.$store.state.count; } }, methods: { increment() { this.$store.commit('increment'); } } } </script> ``` ``` <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> ``` 3. Event Bus Event Bus是一种发布/订阅模式,在Vue实例之间传递事件。 组件A: ``` <script> export default { methods: { handleClick() { this.$bus.$emit('event-name', 'Hello, B!'); } } } </script> ``` 组件B: ``` <script> export default { created() { this.$bus.$on('event-name', message => { console.log(message); }) } } </script> ``` 4. provide/inject provide/inject是Vue提供的一种依赖注入的方式,可以将数据注入到子孙组件。 父组件: ``` <template> <div> <child-component></child-component> </div> </template> <script> export default { provide: { message: 'Hello, child!' } } </script> ``` 子组件: ``` <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { inject: ['message'] } </script> ``` ### 回答2: 在Vue,子组件与父组件之间通信可以通过两种方式实现,一种是通过props和$emit,另一种是通过$refs。 首先,通过props和$emit实现子组件和父组件通信。在父组件,我们可以定义一个数据属性,并通过props将其传递给子组件。子组件可以通过props接收父组件传递过来的数据,并在子组件使用。当子组件需要向父组件传递消息时,可以通过$emit方法触发一个自定义事件,并将需要传递给父组件的数据作为参数传递给$emit方法。父组件可以通过在子组件上监听这个自定义事件,并在事件处理函数接收子组件传递过来的数据。 其次,通过$refs实现子组件和父组件通信。在父组件,我们可以通过给子组件添加ref属性来获取子组件引用。这样,父组件就可以通过$refs属性来访问子组件实例。通过$refs属性,父组件可以直接调用子组件的方法或访问子组件的数据,实现子组件和父组件通信。 总而言之,Vue的子组件和父组件通信可以通过props和$emit、$refs等方式来实现。选用哪种方式取决于具体的需求和场景。 ### 回答3: Vue组件和父组件通信可以通过props和$emit实现。 props是父组件向子组件传递数据的方式。在父组件模板,可以通过v-bind指令将数据传递给子组件的props属性,子组件可以通过props属性接收并使用这些数据。 例如,在父组件: <template> <div> <child-component :message="message"></child-component> </div> </template> <script> export default { data() { return { message: 'Hello Vue!' } } } </script> 在子组件: <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> $emit是子组件向父组件传递数据的方式。子组件可以通过this.$emit方法触发父组件的自定义事件,并将数据作为参数传递给父组件。 例如,在子组件: <template> <div> <button @click="sendData">Send Message</button> </div> </template> <script> export default { methods: { sendData() { this.$emit('send', 'Hello Parent!') } } } </script> 在父组件: <template> <div> <child-component @send="receiveData"></child-component> </div> </template> <script> export default { methods: { receiveData(message) { console.log(message) // 输出'Hello Parent!' } } } </script> 通过props和$emit,子组件和父组件可以进行双向的数据通信,实现了组件之间的交互和数据传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值