Vue組件創建和組件傳值


Vue創建組件的方式

使用Vue.Extend()和Vue.component全局注冊組件

首先我們定義一個組件並接收

		var com1 =Vue.extend({
			template:"<h3>這是通過Vue.extend創建的組件</h3>"
		});

然后我們全局注冊這個組件

		Vue.component('mycom1',com1);

這樣我們就可以在我們的代碼中使用我們的mycom1組件了

		<div id="app">
			
		<mycom1></mycom1>
		</div>

需要注意的是,如果我們注冊的組件名稱是以駝峰命名法來命名的,那么我們在使用的時候將不能使用原本注冊時的命名,如下的寫法時錯誤的

//定義
Vue.component('myCom1',com1);

//使用
		<div id="app">
			
		<myCom1></myCom1>
		</div>

我們在使用的時候需要將駝峰命名法的兩個單詞使用‘-’進行分開,並且更加推薦‘-’左右兩端的單詞均使用小寫,如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			
		<my-com1></my-com1>
		</div>

	<script>
		var com1 =Vue.extend({
			template:"<h3>這是通過Vue.extend創建的組件</h3>"
		});
		Vue.component('myCom1',com1);
		var vm = new Vue({
			el:'#app',
			data:{
			}
			
		})
	</script>
	</body>
</html>

同時我們可以將構造和注冊結合在一起

		Vue.component('myCom1',Vue.extend({
			template:"<h3>這是通過Vue.extend創建的組件</h3>"
		}));

更加簡化的方式

		Vue.component('myCom1',{
			template:"<h3>這是通過Vue.extend創建的組件</h3>"
		});

需要注意的是,我們不管使用哪種方式來定義組件,template中定義的頂級元素只能有一個,否則會出現錯誤

使用Vue.component()配合Vue的templete標簽來定義組件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<my-com1></my-com1>
		</div>

	<template id="mycom2">
		<h3>這是通過Templete定義的組件,在html代碼中有智能提示</h3>
	</template>
	<script>
		Vue.component('myCom1',{
			template:"#mycom2"
		});
		var vm = new Vue({
			el:'#app',
			data:{
			}
			
		})
	</script>
	</body>
</html>

需要注意的是,上述的定義方式都是定以的全局Vue對象均可使用,下面我們定義一個私有的組件

Vue.component私有組件

Vue對象內部有一個components組件,可以定義我們想要的組件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<login></login>
		</div>

	<script>
		var vm = new Vue({
			el:'#app',
			data:{
			},
			components:{
				login:{
					template:'<h3>這是私有的login組件</h3>'
				}
			}
			
		})
	</script>
	</body>
</html>

同時仍然可以使用上述的template方式來定義組件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<login></login>
		</div>
	<template id="app2">
		<h3>這是私有組件配合template方式定義的組件</h3>
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
			},
			components:{
				login:{
					template:'#app2'
				}
			}
			
		})
	</script>
	</body>
</html>

組件的data

定義的組件可以有自己的data數據域,但是data必須為一個function且必須返回一個對象格式的數據,除此之外和Vue對象中的data的使用方法完全一致

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<login></login>
		</div>
	<template id="app2">
		<h3>這是私有組件配合template方式定義的組件---{{msg}}</h3>
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
			},
			components:{
				login:{
					template:'#app2',
					data:function(){
						return {
							msg:"這是組件中的數據"
						}
					}
				}
			}
			
		})
	</script>
	</body>
</html>


組件切換

使用v-if和v-else實現組件切換

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<a href="#" @click.prevent="flag=true">登錄</a>
			<a href="#" @click.prevent="flag=false">注冊</a>
			<login v-if="flag"></login>
			<register v-else="flag"></register>
		</div>
	<template id="app2">
		<h3>這是登錄組件</h3>
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
				flag:true
			},
			components:{
				login:{
					template:'#app2',
				},
				register:{
					template:'<h3>注冊組件</h3>',

				}
			}
			
		})
	</script>
	</body>
</html>


不過使用這種方式只能實現兩種類型的組件切換

使用component元素進行組件切換

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<a href="#" @click.prevent="comName='login'">登錄</a>
			<a href="#" @click.prevent="comName='register'">注冊</a>
			<component :is="comName"></component>
		</div>
	<template id="app2">
		<h3>這是登錄組件</h3>
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
				comName:'login'
			},
			components:{
				login:{
					template:'#app2',
				},
				register:{
					template:'<h3>注冊組件</h3>',

				}
			}
			
		})
	</script>
	</body>
</html>

我們使用定義在data中的屬性來切換component中要展示的組件,使用:is來代表最后要展示的組件的值

父子組件傳值

父組件向子組件傳遞數據

子組件默認無法直接訪問到父組件(對象)中的數據,需要使用v-bind表達式來傳遞,結合組件的props屬性來使用,即可達到父組件向子組件傳遞數據

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<login v-bind:parentmsg="msg"></login>
		</div>
	<template id="app2">
		<h3>這是私有組件配合template方式定義的組件--{{parentmsg}}</h3>
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
				msg:"這是父組件中的數據"
			},
			components:{
				login:{
					template:'#app2',
					data(){
						return {
							name:'zhangsan',
							age:'24'
						}
					},
					props:['parentmsg']
				}

			}
			
		})
	</script>
	</body>
</html>

需要注意的是,通過props傳遞過來的數據是不推薦被修改的,強行修改會報錯

props中定義的屬性全部都是由父組件傳遞給子組件的

而子組件data中的數據是組件私有,可以被修改的

子組件向父組件傳遞數據

子組件向父組件傳值是通過父組件向子組件傳遞事件實現的

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript" src="lib/vue-2.4.0.js" ></script>
		<script type="text/javascript" src="lib/vue-resource-1.3.4.js"></script>
		<link rel="stylesheet" href="lib/bootstrap-3.3.7.css" />
	</head>
	<body>
		<div id="app">
			<login @func="show"></login>
		</div>
	<template id="app2">
		<input type="button" value="子組件按鈕" @click="myclick" />
	</template>
	<script>
		var vm = new Vue({
			el:'#app',
			data:{
				msg:"這是父組件中的數據"
			},
			methods:{
				show(data){
					console.log("這是父組件的事件"+data)
				}
			},
			components:{
				login:{
					template:'#app2',
					data(){
						return {
							name:'zhangsan',
							age:'24'
						}
					},
					props:['parentmsg'],
					methods:{
						myclick(){
							this.$emit('func',this.name);
						}
					}
				}

			}
			
		})
	</script>
	</body>
</html>

從如上代碼可知,父組件調用子組件中的數據需要借助this.$emit來進行傳遞,傳遞的第一個參數都是函數名,后面的參數都是傳遞的數據,可以傳遞單個屬性或者是對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM