Vue父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)

父子组件之间传值

父传子:父组件向子组件传值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>

结果如图所示
==Vue父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)

Vue父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)

兄弟组件之间传值

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父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)
Vue父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)

子组件调用父组件方法

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>

结果如图所示
Vue父子组件之间传值、兄弟组件之间传值、子组件调用父组件方法(有例子方便理解)

第二种方法是在子组件里用$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>

上一篇:转:三款免费好用的Gif录屏神器


下一篇:在D-Bus适配器中声明槽