父传子:父组件向子组件传值props,父组件嵌套的子组件的Child1中,使用(简写:)v-bind:pardata="pardata"进行属性的绑定,并传递这个值
子传父:子组件在button通过绑定一个事件childdatasend,在这个事件通过$emit把值传给父组件,父组件通过(简写@)v-on:进行事件的绑定子组件传过来的事件名childdatasend(即代码表示@childdatasend=“xxx”),然后在methods使用该方法获取到值并使用即可
父组件的代码:
<template> <div id="app"> 我是父组件:{{jieshoudata}} <Child1 :pardata="pardata" @childdatasend="childdatasend"></Child1> <Child2></Child2> </div> </template> <script> import Child1 from '../components/child1.vue' import Child2 from '../components/child2.vue' export default{ data(){ return{ pardata:'你好,我是父组件的值521', jieshoudata:'', } }, methods:{ childdatasend(value){ //直接接受子组件传过来的值 this.jieshoudata=value } }, components:{ Child1, Child2 } } </script> <style lang="less" scoped> </style>
子组件的代码
<template> <div id="app"> <h2>我是子组件一</h2> <div style="margin-top: 20px;"> 我是父组件传过来的值:{{pardata}} </div> <div> <button @click="childdatasend">传值给父组件</button> </div> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ props:['pardata'], data(){ return{ childdata:'我是子组件的值520' } }, methods:{ childdatasend(){ this.$emit('childdatasend', this.childdata) } } } </script> <style lang="less" scoped> </style>
结果如图所示
==
1、兄弟之间传递数据需要借助于事件车,通过事件车的方式传递数据
2、创建一个Vue的实例,让各个兄弟共用同一个事件机制。
3、传递数据方,通过一个事件触发bus.$emit(方法名,传递的数据)。
4、接收数据方,通过mounted(){}触发bus.$on(方法名,function(接收数据的参数){用该组件的数据接收传递过来的数据}),此时函数中的this已经发生了改变,可以使用箭头函数。
实例如下我们单独创建一个EventBus.js,内容如下
import Vue from 'vue' export default new Vue;
父组件的代码:
<template> <div id="app"> 我是父组件:{{jieshoudata}} <Child1 :pardata="pardata" @childdatasend="childdatasend"></Child1> <Child2></Child2> </div> </template>
子组件一的代码:重点通过bus.$emit传递
<template> <div id="app"> <h2>我是子组件一</h2> <div style="margin-top: 20px;"> 我是父组件传过来的值:{{pardata}} </div> <div> <button @click="childdatasend">传值给父组件</button> <button @click="SendMsg">传值给兄弟2组件</button> </div> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ props:['pardata'], data(){ return{ childdata:'我是子组件的值520' } }, methods:{ //兄弟组件传值事件 SendMsg(){ bus.$emit('sendbrodata', '您好,我是子组件一传给子组件二的值') }, } } </script> <style lang="less" scoped> </style>
子组件二的代码:
<template> <div id="app"> <h2>我是子组件二</h2> <p>从子组件一接收到的值:{{msg}}</p> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ data(){ return{ msg:'子组件二默认的值' } }, mounted() { //通过bus.$on接收子组件一传过来的值 如果不是箭头函数要注意this的指向问题 bus.$on("sendbrodata", (msg)=>{ this.msg = msg }) } } </script> <style lang="less" scoped> </style>
结果如图所示
Vue中子组件调用父组件的方法,有三种方法如下:
1.直接在子组件中通过this.$parent.event来调用父组件的方法
父组件的代码:重点是fathermethod方法
<template> <div id="app"> 我是父组件:{{jieshoudata}} <Child1 :pardata="pardata" @childdatasend="childdatasend"></Child1> <Child2></Child2> </div> </template> <script> import Child1 from '../components/child1.vue' import Child2 from '../components/child2.vue' export default{ data(){ return{ pardata:'你好,我是父组件的值521', jieshoudata:'', } }, methods:{ childdatasend(value){ //直接接受子组件传过来的值 this.jieshoudata=value }, //重点是这里父组件的方法 fathermethod(){ console.log('这是父组件的方法') } }, components:{ Child1, Child2 } } </script> <style lang="less" scoped> </style>
子组件的代码:绑定一个button事件 直接通过this.$parent.fathermethod调用
<template> <div id="app"> <h2>我是子组件二</h2> <p>从子组件一接收到的值:{{msg}}</p> <button @click="child2click">this.$parent.event直接调用父组件的方法</button> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ data(){ return{ msg:'子组件二默认的值' } }, mounted() { //通过bus.$on接收子组件一传过来的值 如果不是箭头函数要注意this的指向问题 bus.$on("sendbrodata", (msg)=>{ this.msg = msg }) }, methods:{ child2click(){ this.$parent.fathermethod(); } } } </script> <style lang="less" scoped> </style>
结果如图所示
第二种方法是在子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了。
子组件的代码:
<template> <div id="app"> <h2>我是子组件二</h2> <p>从子组件一接收到的值:{{msg}}</p> <button @click="child2click">this.$parent.event直接调用父组件的方法</button> <button @click="emitclick">$emit向父组件触发一个事件</button> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ data(){ return{ msg:'子组件二默认的值' } }, mounted() { //通过bus.$on接收子组件一传过来的值 如果不是箭头函数要注意this的指向问题 bus.$on("sendbrodata", (msg)=>{ this.msg = msg }) }, methods:{ //第一种 child2click(){ this.$parent.fathermethod(); }, 重点是这里--第二种 emitclick(){ this.$emit('fathermethod') } } } </script> <style lang="less" scoped> </style>
父组件的代码:
<template> <div id="app"> 我是父组件:{{jieshoudata}} <Child1 :pardata="pardata" @childdatasend="childdatasend"></Child1> <Child2 @fathermethod="fathermethod"></Child2> <!--第二种方法 父组件监听子组件传过来的事件 子组件就可以直接调用了--> </div> </template> <script> import Child1 from '../components/child1.vue' import Child2 from '../components/child2.vue' export default{ data(){ return{ pardata:'你好,我是父组件的值521', jieshoudata:'', } }, methods:{ childdatasend(value){ //直接接受子组件传过来的值 this.jieshoudata=value }, fathermethod(){ console.log('这是父组件的方法') } }, components:{ Child1, Child2 } } </script> <style lang="less" scoped> </style>
第三种方法:是父组件把方法传入子组件中,在子组件里直接调用这个方法,子组件通过props接收的时候接收一个对象 如这样接收
props:{
fathermethod2:{
type:Function,
default:null
}
},
父组件代码:
<template> <div id="app"> 我是父组件:{{jieshoudata}} <Child1 :pardata="pardata" @childdatasend="childdatasend"></Child1> <Child2 @fathermethod="fathermethod" :fathermethod2="fathermethod2"></Child2> <!--第三种方法 是父组件把方法传入子组件中,在子组件里直接调用这个方法--> </div> </template> <script> import Child1 from '../components/child1.vue' import Child2 from '../components/child2.vue' export default{ data(){ return{ pardata:'你好,我是父组件的值521', jieshoudata:'', } }, methods:{ childdatasend(value){ //直接接受子组件传过来的值 this.jieshoudata=value }, fathermethod(){ console.log('这是父组件的方法') }, //第三种方法测试 fathermethod2(){ console.log('这是父组件的方法2') } }, components:{ Child1, Child2 } } </script> <style lang="less" scoped> </style>
子组件的代码:
<template> <div id="app"> <h2>我是子组件二</h2> <p>从子组件一接收到的值:{{msg}}</p> <button @click="child2click">this.$parent.event直接调用父组件的方法</button> <button @click="emitclick">$emit向父组件触发一个事件</button> <button @click="threeclick">第三种方法:组件把方法传入子组件中,在子组件里直接调用这个方法</button> </div> </template> <script> import bus from '../../utils/EventBus.js' export default{ //重点是这里 props:{ fathermethod2:{ type:Function, default:null } }, data(){ return{ msg:'子组件二默认的值' } }, mounted() { //通过bus.$on接收子组件一传过来的值 如果不是箭头函数要注意this的指向问题 bus.$on("sendbrodata", (msg)=>{ this.msg = msg }) }, methods:{ //第一种子组件直接通过this.$parent.event直接调用父组件的方法 child2click(){ this.$parent.fathermethod(); }, //第二种 emitclick(){ this.$emit('fathermethod') }, 重点是这里-第三种 threeclick(){ if(this.fathermethod2){ this.fathermethod2(); } } } } </script> <style lang="less" scoped> </style>