1. 程式人生 > 其它 >Vue(10)——元件(一)基礎介紹、全域性註冊、單向資料流

Vue(10)——元件(一)基礎介紹、全域性註冊、單向資料流

元件

基礎介紹

參考:Vue 元件_嗶哩嗶哩

  • 元件本質上是可複用的Vue例項,所以在內部同樣有data,methods等屬性
  • 區別是:沒有掛載的宣告,不存在el這樣的掛載選項;

template——定義掛載Dom,也可以理解為設定元件結構,最終被引入根例項

注意:template定義的結構只能有一個根元素(即所有的內容都包含在一個Dom元素裡)

props——自定義元件的屬性的陣列,方便其他元件傳值,類似介面的的形參,用來接收資料

data——元件裡的data要封裝在一個方法裡,是因為要區分全域性的變數的定義,確保元件定義的變數只能在元件內部呼叫

用途

  1. 用於封裝頁面的部分功能,將功能的結構、樣式、邏輯程式碼封裝成一個整體
  2. 提高功能的複用性、可維護性,更好專注業務邏輯

形式

通過元件名作為Html自定義標籤名

		<div id="app">
			<!--普通Html標籤  -->
			<span>普通Html標籤</span>
			<!-- 自定義元件標籤-->
			<my-com></my-com>
		</div>

全域性註冊

  • 全域性註冊的元件在註冊後可用於任意例項或元件裡
  • 全域性註冊必須設定在根Vue例項建立之前

元件命名規則

定義有兩種規則

  1. kebab-case: my-component
  2. PascalCase: MyComponent
Vue.component('MyCom',{/*選項物件*/});
Vue.component('my—com',{/*選項物件*/});

應用規則

在Dom裡只能採用kebab-case: ' my-component'

<my-com :vk="msg"></my-com>	

Demo:

		<div id="app">
			<!--普通Html標籤  -->
			<span>普通Html標籤</span>
			<!-- 自定義元件 -->
			<my-com></my-com>
		</div>
			Vue.component('MyCom',{
				template:`<div><p>這裡是結構最簡單的元件</p></div>`
			});

單向資料流

  1. 父子間元件的所有prop都是單向下行繫結的。包含兩層含義

    • 傳值只能父元件向子元件傳值
    • 子元件的變化不能反向影響父元件的資料

    父元件向子元件傳值Demo

    		<div id="app">
    			<!-- 3.給元件自定義屬性vk傳值-->
    			<!-- 注意:這裡的value必須是定義在元件父級元素裡的 -->
    			<my-com :val="msg"></my-com>
    		</div>
    
    		<script type="text/javascript">
    		// 全域性元件必須宣告在Vue例項建立之前
    		   <!-- 宣告方式1 -->
    			Vue.component('MyCom',{
    				//1.為元件宣告一個屬性val
    				props:['val'],
    				//2.將元件裡的屬性val值賦給template裡Dom元素的屬性
    				template:`<input type="text" :value="val"></input>`
    			});
    			new Vue({
    				el:"#app",
    				data:{
    					msg:"Hello Word"
    				}
    			})
    		</script>
    
  2. 如果子元件要更改prop引數接收到的資料,應當儲存在data中後操作

    		<div id="app">
    			<my-com :val="msg"></my-com>
    		</div>
    
    		<script type="text/javascript">
    			Vue.component('MyCom',{
    				props:['val'],
    				template:`<div>
                    {{title}}
                    <button  @click="fn">按鈕</button>
                    </div>`,
                    data:function(){
    					return{
                            //1.將prop屬性val儲存在data中的title中
    						title:this.val
    					}
    				},
                    methods:{
                        fn(){
                            //2.儲存完再更改儲存的值title,不要直接修改this.val = "Hello Vue"會報錯
                            this.title = "Hello Vue"
                        }
                    }
    			});
    			new Vue({
    				el:"#app",
    				data:{
    					msg:"Hello Word"
    				}
    			})
    		</script>
    
  3. 如果prop為物件或者陣列時,子元件操作會影響父元件的狀態。

因為當prop為物件或者陣列時,傳遞的是物件或者陣列的引用,所以父子元件操作的引用指向的是同一物件或陣列,任一一方改變都會真實改變這個物件或者陣列的值

<div id="app">
			{{student.sname}}:{{student.age}}
			<my-com 
			:val="msg" 
			:stu="student"
			></my-com>
           
		</div>
        <script type="text/javascript">
			Vue.component('MyCom',{
				props:['val','stu'],
				template:`<div>
                {{title}}
                <button  @click="fn">按鈕</button>
				{{st.sname}}:{{st.age}}
                </div>`,
                data:function(){
					return{
                        //1.將prop屬性val儲存在data中的title中
						title:this.val,
						st:this.stu
					}
				},
                methods:{
                    fn(){
                        //2.儲存完再更改儲存的值title,不要直接修改this.val = "Hello Vue"會報錯
                        this.title = "Hello Vue";
						this.st.sname = "Hanmeimei";
						this.st.age = 19;
                    }
                }
			});
			new Vue({
				el:"#app",
				data:{
					msg:"Hello Word",
					student:{
						sname:"Lilei",
						age:18
					}
				}
			})
		</script>