Vue學習第四天(組件的相關操作)

Vue學習第四天(組件的相關功能)
,今天寫了兩個博文,第一篇補上了昨天的知識點,這一篇簡單總結下,今天的學習內容,今天主要學習了vue中的組件的概念,說起組件化的創作理念,就要在提一提我們之前的分層概念,也就是模塊化思想,這種思想在後端代碼中很常見

  1. 模塊化,將每一層的代碼功能細化
  2. 組件化,按照前臺的網頁結構進行的網頁拆分
    下面簡單寫一下,vue中組件究竟是如何使用的吧
    第一種方法,我們先進行繼承模板的製作,在此基礎上進行容器的製作
var com1 = Vue.extend({
			   //模板即我們要渲染的html結構
			   template: '<h3>我的一個道姑朋友</h3>'
		   })
		   //如果此處使用了駝峯命名,我們在頁面使用時應該去掉駝峯加上-
		   Vue.component('mycpm1', com1)

不難看出,在繼承模板中,我們定義了一個屬性template,這個屬性,我們在後面會經常提到,這是當前組件的html結構,在得到這個繼承模板以後,我們在使用vue的內置方法制作組件,組件名爲mycpm1,繼承自模板com1,在使用時,我們只需要將標籤放入到網頁中即可

<div id="app1">
	<mycpm1></mycpm1>
</div>

挺簡單的吧
下面介紹第二種方式創建實例,我們將使用更簡潔的方式,那就是,將兩步合成一步

Vue.component('mycpm3', {
			   template:'#emp1'
		   })

不難看到,此時的template屬性後面跟上了一個選擇器,我們在網頁上新建一個template標籤,讓他的id等於emp1,然後就能調用了

<template  id="emp1">
			<div>
				<input type="text" name="" id="" value="" />
				<button type="button">戳我</button>
			</div>
		</template>

這裏順便提一下,我們的組件理論上只能有一個根,即根元素是單一的,否則,vue會報錯,上面這種定義方法,和第一種的調用方法,完全一致
另外,對於組件而言,她也有自己的數據,但是這裏的data,不再是一個屬性,而是一個方法,爲的是,多個實例使用同一個模板時,它們之間的數據不會混亂,就像這樣

var vue = new Vue({
			   el:'#app1',
			   data:{
				   
			   },
			   methods:{
				   
			   },
			   components:{
				   //可以自定義一個私有化的組件,僅供當前vue實例使用
				   login:{
					   template:'<h3>誤殺</h3>'
				   },
				   //也可以在組件中定義一個data方法,用於處理個性化的數據
				   mytext:{
					   template:'<h3>南朝四百八十寺,多少樓臺煙雨中-->{{msg}}</h3>',
					   data:function(){
						   return {
							   msg:"金光閃閃的五個字"
						   }
					   }
				   }
			   }
		   })

而且,我們還可以在組件中帶哦用,我們的數據,可以直接使用插值表達式的方式進行操作
對於昨天的動畫效果,我們也可以搬到組件中來使用,同樣,我們首先要把使用動畫的html結構使用標籤包裹住,就像下面這樣

<div id="app4">
			<button v-on:click="denglu">登陸</button>
			<button v-on:click="zhuce">註冊</button>
			<!--可以使用v-bind:is指定不同的組件id,用一個元素,切換兩個不同組件-->
			<!--通過mode屬性控制組件切換,先出後進,不會衝突-->
			<transition mode="out-in">
				<component v-bind:is="com1"></component>
			</transition>
		</div>

這個組件這裏,還是用了一個新的知識點,那就是v-bind:is,這裏是我們爲當前組件綁定了一個組件,細心的讀者可能已經發現,我們使用的標籤是通配標籤,也就是說,這個地方可以是任何我們定義過的組件,此時,這個地方是什麼標籤取決於com1的值。我們不妨在vue實例中定義一個數據com1,在定義一個函數,用來切換com1的值,就能使用一個標籤完成兩個標籤的切換

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>登錄頁</title>
		<script src="js/vue.js" type="text/javascript"></script>
		<style>
			
			.v-enter{
				opacity: 0;
				transform: translateZ(150px);
			}
			.v-leave-to{
				opacity: 0;
				transform: translateX(150px);
			}
			
			.v-enter-active,
			.v-leave-active{
				transition: all 0.6s ease;
			}
		</style>
	</head>
	<body>
		<div id="app3">
			<button v-on:click="denglu">登陸</button>
			<button v-on:click="zhuce">註冊</button>
			<login v-if="flag"></login>
			<register v-else="flag"></register>
		</div>
		<div>-----------------------------------------------</div>
		<div id="app4">
			<button v-on:click="denglu">登陸</button>
			<button v-on:click="zhuce">註冊</button>
			<!--可以使用v-bind:is指定不同的組件id,用一個元素,切換兩個不同組件-->
			<!--通過mode屬性控制組件切換,先出後進,不會衝突-->
			<transition mode="out-in">
				<component v-bind:is="com1"></component>
			</transition>
		</div>
		<template id="emp1">
			<h2>我的是登錄頁</h2>
		</template>
		<template id="emp2">
			<h2>先生需要註冊哦</h2>
		</template>
		<script>
			var vue = new Vue({
				el:'#app3',
				data:{
					flag:true
				},
				methods:{
					denglu:function(){
						this.flag = true
					},
					zhuce:function(){
						this.flag = false
					}
				},
				components:{
					login:{
						template:'#emp1'
					},
					register:{
						template:'#emp2'
					}
				}
			})
			var vue1 = new Vue({
				el:'#app4',
				data:{
					com1:"login"
				},
				methods:{
					denglu:function(){
						this.com1 = "login"
					},
					zhuce:function(){
						this.com1 = "register"
					}
				},
				components:{
					login:{
						template:'#emp1'
					},
					register:{
						template:'#emp2'
					}
				}
			})
		</script>
	</body>
</html>

最後,我們講一些父子標籤的問題,在子標籤中,我們可以使用父組件中的數據和函數,不過要通過一些特殊的方式,當我們要使用數據時,我們需要三步

  1. 在引用時使用v-bind:xxx=“data”,將數據傳送過來
  2. 在組件中使用props接受一下綁定的屬性
  3. 在組件模板中使用即可,但是傳遞過來的數據都是隻讀的
    在html中
<div id="app1">
			<!--在組件上綁定函數,用來傳遞實例的方法給組件-->
			<login v-bind:pmsg="msg" v-on:fun="show"></login>
		</div>
		<template id="emp1">
			<div>
				<h3>{{pmsg}}, 牧童遙指杏花村<h3>
				<button v-on:click="push">push</button>
			</div>
		</template>

在VUE實例中

var vue = new Vue({
				el:'#app1',
				data:{
					msg:"借問酒家何處有"
				},
				methods:{
					show:function(){
						console.log("我是父容器的一個方法,我會輸出666");
					}
				},
				components:{
					//理論上,私有組件無法訪問到所在實例的內容
					//但是我們可以通過屬性綁定的方式,將數據傳遞過來
					//1. 在引用時使用v-bind:xxx="data",將數據傳送過來
					//2. 在組件中使用props接受一下綁定的屬性
					//3. 在組件模板中使用即可,但是傳遞過來的數據都是隻讀的
					login:{
						template:'#emp1',
						props:['pmsg'],
						methods:{
							push:function(){
								//在組件自身的方法中,我們可以調用傳入的方法
								//不過必須使用this.$emit觸發
								this.$emit('fun')
							}
						}
					}
				}
			})

使用父組件的方法,則需要先進行事件綁定,在使用組件內置的方法this.$emit(‘方法名’)即可調用
希望生活早日恢復正軌,爲之則易,不爲則難

發佈了57 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章