vue(3)—— vue的全局組件、局部組件


組件

vue有局部組件和全局組件,這個組件后期用的會比較多,也是非常重要的

局部組件

 

template與components屬性結合使用掛載

 

 

其中 Vmain、Vheader、Vleft、Vcontent都是局部組件,Vheader、Vleft、Vcontent是一起掛載在Vmain組件上的,這里的Vmain可以看成一個入口組件,再將入口組件掛載在Vue實例對象上,就可以渲染成一個頁面了

 

當然這里我沒有給css屬性,看着不好看,感興趣的自己去添加就行了,並且這里使用組件渲染頁面時,因為使用的是template屬性,所以el掛載點失效

 

利用內置組件<component :is="componentId"></component> 掛載使用

 

當然你說我就要掛載在app下呢?所以這里又有另一種寫法,使用<component>標簽,里面用v-bind綁定一個is屬性,is屬性值對應組件的名字,用引號包住

 

這樣的寫法,就可以直接哪里需要組件,直接給一個<component>標簽就行了,而Vue實例化對象里不用掛載,也不用使用template屬性渲染了

 

這種寫法按照官方文檔,它是一個內置的組件(也就是自帶的,不需要我自己定義直接使用的):

 

  

組件還可以復用:

 

一個組件內的data必須是一個函數:

你如果在組件內想使用data那就用函數就完了,可以用單體模式定義data的函數,如:

 

 

注意

1.組件的使用步驟:

  • 創建一個組件
  • 掛載組件
  • 使用組件

2.組件使用時,就是組件的名字作為標簽,並且是單標簽,且必須要有閉合符號【/】

3.組件可以復用

4.組件內的data必須是一個函數

5.組件是一個單向數據流

6.定義組件名避免和html元素重合,導致一些不必要的事情發生

 

組件的組成結構是這樣的:

像如上的結構,在Vmain組件里又掛載了三個子組件,這些組件其實也完全可以直接掛載在Vue實例對象里啊,可以是可以的,我舉個生活的例子來說明,比如你是老板,你有個通知要通知給你的每個員工,你是要自己去挨個通知呢?還是找個負責人,讓他帶你挨個通知呢?能理解了吧?

理解之后,看官方給的組件結構:

 

 

也就是是說,數據傳輸是單向的,一級一級的傳遞,為什么這么說呢?看完下面的傳遞參數你就懂了

 

 

 

父級組件傳遞參數給子級組件

父向子傳參,需要使用props屬性

  

 

 步驟

1.定義好需要傳遞的參數

2.在template模板里用v-bind綁定好屬性

3.在Vue實例綁定的入口組件里添加 props屬性,里面寫入Vue實例傳遞過來的的參數的鍵(注意是鍵不是值)

4.在利用props屬性接收到的組件里綁定屬性,鍵為自定義鍵,值為props父級組件傳遞過來的的鍵

5.在子級里同樣的利用props接收參數

6.是否需要再往子級組件傳遞參數,如果要,再用v-bind綁定屬性,屬性的鍵自定義,值為父級傳遞過來的鍵,如果不再傳遞,直接用jinja2語法渲染到標簽元素里

 

同樣的,如果要使用component內置組件來渲染,直接掛載到元素里,其他沒做任何改動:

 

子級向父級傳遞參數

 

在以后的開發中,可能會遇到,子級會向父級反饋數據的情況,所以,子級向父級傳遞參數這個功能還是挺有用的。

但是本質上並不是直接傳輸,而是通過v-on監聽事件傳輸的,結合Vue實例里的$emit實現的。這個$emit是Vue實例里自帶的,$emit()方法來觸發自定義的事件, 第一個參數是自定義的事件名字 第二個參數就是傳遞的值,其中this指的vue實例化對象的子類

 

 

如上,父級的Vmain組件確實拿到了,並在控制台輸出了

 

注意:

 

1.子級組件根據子級的邏輯向父級傳遞的參數,使用的是this.$emit方法,有關$emit的方法,傳送門 

通俗的說,你可以理解為this.$emit就是一個數據通道,可以連接子級組件和父級組件

2.父級組件中v-on綁定的方法名必須和$emit()第一個參數的事件名一致,即可以理解為自定的監聽事件,之后則可以通過這個事件接收到子級傳來的參數了

 

全局組件

 

全局組件,顧名思義了,不多解釋了 

 

全局組件定義好后不需要掛載(或者叫注冊),直接可以使用,使用的全局組件名作為標簽,且是雙標簽

 

那前面的局部組件用了另一種渲染方式,使用了<component>標簽,你可能會想,這里全局也用<component>標簽會怎么樣呢?不行的,會報錯,提示未定義

 

所以你需要在data里先定義一下就行:

 

 

  

 

定義全局組件的其他三個方法

 

利用script標簽(比較少見)

 

利用Vue.extend和Vue.component

 

利用template標簽

這個以后在組件化開發中用的很多

 

 

 

動態組件:

動態組件是利用component結合全局組件做出來的,官方解釋:

 

如下,點頭部,頁面就顯示成頭部內容,點底部,就顯示成了底部內容

 

這里的a標簽我綁定了一個v-on,阻止了冒泡事件啊,就是前面的知識點了,詳細的不多說

 

 

全局組件也可以被局部組件使用,並且復用:

 

插槽<slot>

但是,如果復用全局組件就有一個問題,因為在實際開發中,有公用的元素就可以使用公用的,比如繼承一個公用的css屬性什么的,但是每個內容部分都有不同的數據,或者說需要在公用的基礎上做些自己適當的調整嗎,像這種需求是很多的。比如如下,我想顯示不同的內容這樣就無法顯示內容:

 

 

 

所以這里需要用到內置組件<slot>,如下,其他沒做任何更改,只是在創建全局組件部分插入了一個<slot></solt>組件即可顯示我們想要顯示的內容

 

 

 

然后,其他就沒什么需要注意的了,因為全局組件的用法其實跟局部組件的用法是一樣的

 

 

總結:

vue的組件,看着知識點多,有點繞,但還是基礎,且是非常重要的基礎,一定要注意以上提到的注意點

 


免責聲明!

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



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