1. 程式人生 > >關於父類元件和子類元件的互相傳值

關於父類元件和子類元件的互相傳值

第一步:子類向父類傳值

在java中父類是可以將值傳給子類的,但是卻不能從子類拿到值,同理子類是可以將父類的值拿到手,但是卻不能將自己的值傳給父類

而在vue中,子類和父類之間是不允許傳值的但是,我們可以利用關聯和引用來讓他們之間建立起一些聯絡

子類向父類傳值要使用$emit方法

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>子類向父類傳值</title>
	<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
	<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
	<div id="box">
		<parent1></parent1>
	</div>
	<!-- 父 -->
	<template id="p">
		<h1>{{parentmsg}}<child1 @chuandi="shouji"></child1></h1>
	</template>

	<!-- 子 -->
	<template id="c">
		<div>
		<input type="text" v-model="childmsg">
		<button @click="fanhui">點選就將這個input標籤的值傳遞給父類的方法,並改變父類標籤的內容</button>
		</div>
	</template>
	<script>
		let vm = new Vue({
			el:"#box",
			data:{
				msg:"ds",
			},
			components:{
				"parent1":{
					template:"#p",
					data:function(){
						return{
							parentmsg:"父類的內容",
						}
					},
					methods:{
						shouji:function(value){
							alert(value);
							this.parentmsg=value;
						}
					},
					components:{
						"child1":{
							template:"#c",
							data:function(){
								return{
									childmsg:"自樂",
								}
							},
							methods:{
								fanhui:function(){
									this.$emit("chuandi",this.childmsg);
								}
							}
						}
					}
				}
			}
		})
	</script>
</body>
</html>

為了方便理解,我們就從父類開始分析他們之間的聯絡

1首先父類定義了一個用來接收子類準備返回值的方法——shouji()該方法觸發按鈕和事件,它只是等待子類使用emit方法來觸發它

2然後我們給該方法取了個別名繫結到一個叫做@chaundi的方法名上,該不處理是在父類元件中引用子類元件的時候傳遞給子類元件的

3然後子類元件中有一個方法叫做fanhui,該方法是由button按鈕觸發的,但我們點選按鈕的時候,該方法體內部的

this.$emit("chuandi",this.childmsg);會將該子元件的childmsg傳遞給別名為chuandi的父類的shouji方法,然後父類shouji

方法的value引數就會接收到childmsg的值,父元件就能使用了

步驟不多:一共就是父類監聽,然後取個別名傳給子元件,子元件使用emit呼叫別名,並返回值給父類監聽方法

第二步:父元件向子元件傳遞值

這種就比上一種還要簡單點

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>父向子傳值</title>
	<script src="https://cdn.bootcss.com/vue/2.5.14/vue.min.js"></script>
	<script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
	<div id="box">
		<parent1 :mess="msg"></parent1>
	</div>

	<!-- 父框架 -->
	<template id="p">
		<h1>父類文字內容<child1 :message="mess"></child1></h1>
	</template>

	<!-- 子類文字內容 -->
	<template id="c">
		<h1>子類文字內容{{message}}</h1>
	</template>

	<script>
		let vm = new Vue({
			el:'#box',
			data:{
				msg:"kn"
			},
			components:{
				"parent1":{
					template:"#p",
					props:["mess"],
					data:function(){
						return{
							msg1:"父類傳給子類的遺產",
						}
					},
					/*父類裡面嵌入子*/
					components:{
						"child1":{
							template:"#c",
							props:['message'],
						}
					}
				}
			}
		})
	</script>
</body>
</html>

這裡我們所做的就是將最外圍的vue的msg值傳遞到最裡層的子元件中去

我們第一步將值從vue傳遞到父元件,在div#box中引用父元件的時候,就將msg去個別名賦給:mess

然後父元件定義props:【“mess”】接收了該值,然後在父元件的template中引用子元件的標籤的時候將mess取個別名

:message=”mess“,同理子啊子元件的props:【”message“】也定義了一番,然後就可以在子元件的template中直接使用{{message}}來接收來自父元件的值了。