vue-组件和组件传值

本文介绍了Vue组件,它是可复用的Vue实例,组件中的data须为返回对象的function。还阐述了组件的两种注册形式:全局注册和局部注册。重点讲解了三种组件传值方式,包括父到子用props、子到父用事件派发、非相关组件用空Vue对象的$emit和$on。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue组件和组件传值

组件

组件是可复用的vue实例,且带有一个名字,可以通过 new Vue 创建的 Vue 根实例中把这个组件作为自定义元素来使用
<div id="components-demo">
  <button-counter></button-counter>
</div>

// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

new Vue({ el: '#components-demo' })

组件中的data必须是一个function,其返回一个对象作为组件的数据
 data() {
          return {
            count: 1,
          };
        }

注册组件

在vue中定义组件有两种常见的形式 全局注册和局部注册
全局注册:通过 Vue.componen定义,第一个参数为组件名 全局组件定义之后可以直接使用不需要注册
Vue.component('my-component-name', {
  // ... options ...
})
局部注册 通过一个普通的 JavaScript 对象来定义组件

此对象包含有一些特殊的属性
template 模板内容
data 组件的数据, data必须是一个function,此function有一个对象做为返回值
methods 方法
computed 计算属性
… 其他的等等等等,所有vue中可以使用的方法或者属性都可以在组件内部使用
定义的组件必须只有一个根节点

局部组件在使用的时候需 components 属性进行注册:
var ComponentA = { /* ... */ }

new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
  }
})

组件传值

常见的组件传值有三种:
1、父组件--子组件传值 使用props
2、子组件向父组件传值 使用事件派发
3、非相关组件之间传值 – 空vue对象 $emit(‘ ’,数据) 发送 $on 接收
1、父到子传值

在子组件的组件标签上绑定自定义属性名,值为父组件需要传递的数据
子组件内部通过props属性 数组形式 接收属性名 ,模版内部加载属性名渲染展示父组件数据
Template 标签内 给子组件设置属性

<v-nav :msg=“msg” :n=“name”></v-nav>

在子组件的components设置
props:[‘msg’,‘n’], /*子组件接收数据*/

子组件的template内通过{{}}直接绑定数据即可
代码如下:

<div id="out">
        <h1>父组件-子组件</h1>
        <v-parent></v-parent>
    </div>
    
    <template id="parent">
        <div>
            <h1>父组件</h1>
            <p>{{str}}</p>
            <button @click="send()">发送str数据给子组件</button>
            <hr />
            <v-child :a="str1"></v-child>
        </div>
    </template>
    
    <template id="child">
        <div>
            <h2>子组件</h2>
            <p>接收父组件传递的数据:--{{a}}</p>
        </div>
    </template>

var vm=new Vue({
        el:"#out",
        components:{
            'v-parent':{
                template:'#parent',
                data(){
                    return{
                        str:'我是父组件的数据',
                        str1:''
                    }
                },
                methods:{
                    send(){
                        this.str1=this.str
                    }
                },
                components:{
                    'v-child':{
                        template:'#child',
                        props:['a'],
                        data(){
                            return{
                                
                            }
                        }
                    }
                }
            }
        }
    })
2、子到父传值

在子组件组件标签上绑定自定义事件,子组件内部通过$emit给该事件推送数据,
父组件内部通过事件所绑定的函数参数进行数据接收
代码如下:

<div id="out">
        <h1>子组件-父组件</h1>    
        <v-parent></v-parent>
    </div>
    
    <template id="parent">
        <div>
            <h1>父组件</h1>
            <p>接收子组件的数据:--{{tit}}</p>
            <hr />
            <v-child @toparent="tap($event)"></v-child>
        </div>
    </template>
    
    <template id="child">
        <div>
            <h1>子组件</h1>
            <p>{{str}}</p>
            <button @click="send()">发送给父组件</button>
        </div>
    </template>
var vm=new Vue({
        el:'#out',
        components:{
            'v-parent':{
                template:"#parent",
                data(){
                    return{
                        tit:''
                    }
                },
                methods:{
                    tap(msg){
                        console.log(msg)
                        this.tit=msg;
                    }
                },
                components:{
                    'v-child':{
                        template:'#child',
                        data(){
                            return{
                                str:'this is childs info'
                            }
                        },
                        methods:{
                            send(){
                                this.$emit('toparent',this.str)
                            }
                        }
                    }
                }
            }
        }
    })
3、非相关组件之间传值

事件总线 解决非相关组件之间传值
我们通过定义一个空白的对象 所有的事件派发和监听都在这个对象上进行
代码如下:

<div id="out">
   	<h1>兄弟组件</h1>
   	
   	<v-a></v-a>
   	<hr />
   	<v-b></v-b>
   	<hr />
   	<v-c></v-c>
   	
   </div>
   
   <template id="a">
   	<div>
   		<h1>AAAAAAAA组件</h1>
   		<p>{{str}}</p>
   		<button @click="send()">发送给CCC组件</button>
   	</div>
   </template>
   
   <template id="b">
   	<div>
   		<h1>BBBBBB组件</h1>
   		<p>{{str}}</p>
   		<button @click="send()">发送给CCC组件</button>
   	</div>
   </template>
   
   
   <template id="c">
   	<div>
   		<h1>CCCCCC组件</h1>
   		<p>接收AAA组件数据:--{{stra}}</p>
   		<p>接收BBBB组件数据:--{{strb}}</p>
   	</div>
   </template>
   
</body>
<script type="text/javascript">
   
   var vm1=new Vue({})
   var vm=new Vue({
   	el:"#out",
   	components:{
   		'v-a':{
   			template:'#a',
   			data(){
   				return{
   					str:'AAAAA的数据'
   				}
   			},
   			methods:{
   				send(){
   					vm1.$emit('isa',this.str)
   				}
   			}
   		},
   		'v-b':{
   			template:'#b',
   			data(){
   				return{
   					str:'bbbbbbb'
   				}
   			},
   			methods:{
   				send(){
   					vm1.$emit('isb',this.str)
   				}
   			}
   		},
   		'v-c':{
   			template:"#c",
   			data(){
   				return{
   					stra:'',
   					strb:''
   				}
   			},
   			mounted(){
   				var _this=this;
   				vm1.$on('isa',function(msg){
   					_this.stra=msg
   				})
   				vm1.$on('isb',function(msg){
   					_this.strb=msg
   				})
   				
   			}
   		}
   	}
   })

嗯~~~,就这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值