1. 程式人生 > >Vue.js之父子傳值

Vue.js之父子傳值

官網連結:https://cn.vuejs.org/v2/guide/components-props.html

視訊連結:

https://ke.qq.com/webcourse/index.html#cid=329091&term_id=100390520&taid=2523550984766851&vid=k1428xnewqp

參考文章連結:http://www.cnblogs.com/keepfool/p/5625583.html

如下程式碼所示:

父元件向子元件傳值

程式碼如下所示:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
	<script src="vue.min.js"></script>
<body>
   <div id="app">
   <counter v-bind:count="number"></counter>
   </div>
	<script>
	var counter={
		props:['count'],
		template:`<div>{{count}}</div>`
	}
		var vm=new Vue({
			el:'#app',
			components:{
				// counter可以寫成counter:counter
				counter
			},
			data:{
				number:0
			}
		})

	</script>
</body>
</body>
</html>

子元件只能夠用父元件傳遞過來的值,而不能去修改父元件傳遞過來的值。因為父元件的值可能被多個子元件使用,如果某個子元件修改父元件的值,那麼它也會對其它元件的值造成影響。程式碼如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
	<script src="vue.min.js"></script>
<body>
   <div id="app">
   <counter v-bind:count="number"></counter>
   </div>
	<script>
	var counter={
		props:['count'],
		template:`<div @click="add">{{count}}</div>`,
		methods:{
			add:function(){
				this.count++;
			}
		}
	}
		var vm=new Vue({
			el:'#app',
			components:{
				// counter可以寫成counter:counter
				counter
			},
			data:{
				number:0
			}
		})

	</script>
</body>
</body>
</html>

針對這個問題,我們可以在子元件中定義一個data來儲存父元件傳遞過來的值。讓其資料能夠成為一個獨立的部分來供子元件單獨使用。正確程式碼如下:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
	<script src="vue.min.js"></script>
<body>
   <div id="app">
   <counter v-bind:count="number"></counter>
   </div>
	<script>
	var counter={
		props:['count'],
		data:function(){
			return{
				number:this.count
			}
		},
		template:`<div @click="add">{{number}}</div>`,
		methods:{
			add:function(){
				this.number++;
			}
		}
	}
		var vm=new Vue({
			el:'#app',
			components:{
				// counter可以寫成counter:counter
				counter
			},
			data:{
				number:0
			}
		})

	</script>
</body>
</body>
</html>

子元件向父元件傳值

子元件通過$emit來將值傳遞給父元件,但是前提是一定要有事件觸發。如下程式碼所示:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
	<script src="vue.min.js"></script>
<body>
   <div id="app">
   		<counter v-bind:count="number" @increase="addc"></counter>
		<counter v-bind:count="number" @increase="addc"></counter>
		<div>{{total}}</div>
   </div>
	<script>
	var counter={
		props:['count'],
		data:function(){
			return {
				number:this.count
			}
		},
		template:`<div @click="add">{{number}}</div>`,
		methods:{
			add:function(){
				this.number++;
				this.$emit('increase',1);
			}
		}
	}
		var vm=new Vue({
			el:'#app',
			components:{
				// counter可以寫成counter:counter
				counter
			},
			data:{
				number:1,
				total:2
			},
			methods:{
				addc:function(value){
					this.total+=value;
				}
			}
		})

	</script>
</body>
</body>
</html>