摘要:組件結構基礎知識屬性屬性維護一個組件內部狀態,其余組件正常情況下不可見。方案選擇單文件一行的簡單結構常規的選擇前邊兩種方案解決不了時候的選擇靈活性高注意不論選擇哪一種方案,定義模板時,一定要有一個非標簽元素作根,有且僅有一個。
簡介
組件是可復用的 Vue 實例。
本質上是一個對象,該對象包含data、computed、watch、methods、filters以及生命周期鉤子等成員屬性。
組件結構:
{ data(){ return { // } }, computed:{ displayName(){ return ""; } }, methods:{ onClickHandler(params){ // do something } } }基礎知識 data屬性
data屬性維護一個組件內部狀態,其余組件正常情況下不可見。
可以通過props傳遞給子組件;
可以通過$emit的方式傳遞給父組件;
可以通過this.$refs.ref.$data在mounted生命周期內獲取子組件的內部狀態;
目前不知道如何監聽其變化;
因為計算屬性computed和偵聽屬性watch只能監聽 響應式依賴 的變化,而$refs非響應式。
一個組件的 data 選項必須是一個函數。
data選項有兩種定義方式: 一、對象形式: ``` data:{ //引用該組件的地方,共用一個狀態的引用,以至于,只要有一處修改了$data中的某一屬性值,其它引用該組件的地方也跟隨著改變該屬性值(其實,不是跟隨,本來就是同一個指向)。 } ``` 二、函數形式: ``` data(){ return { //引用該組件的地方,每一個組件都會獲得獨立的引用,互不干擾。 } } ```computed屬性 VS methods屬性 VS filter
區別 | method | computed | filter |
---|---|---|---|
類型 | 函數 | 數據變量 | 函數 |
用途 | 作事件處理函數 | 作數據 | 作管道符 |
作用范圍 | 組建內 | 組建內 | 組建內(局部注冊)、全局(全局注冊) |
參數 | 可以帶參 | 不帶參(非函) | 帶參 |
返回值 | 不要求 | 必須有 | 必須有 |
觸發 | 交互時觸發 | 在它的相關依賴發生改變時才會重新求值 | 傳入的數據變化時執行 |
注意:
Vue中并不是所有的屬性都是響應式的,如$refs無法監聽它的變動;
組件構建的主要區別在于模板的生成方式。
模板定義方式 template選項 字符串模板以HTML標簽結構組成的字符串;
示例:
{ template: "id選擇器指定的模板簡單示例
", props: { level: { type: Number, required: true } } }
以id標識的一段script標簽包裹的HTML片段;
示例:
{ template: "#anchored-heading-template", props: { level: { type: Number, required: true } } }render
發揮JavaScript最大的編程能力,該函數接收一個createElement方法作為第一個參數用來創建VNode;
createElement接收三個參數:組件根節點類型、組件配置對象、子節點(官方關于組件配置對象的說明);
示例:
{ render: function (createElement) { return createElement( "h" + this.level, // tag name 標簽名稱 this.$slots.default // 子組件中的陣列 ) }, props: { level: { type: Number, required: true } } }單文件組件
單文件組件將模板、邏輯、樣式在結構上分離,保存在同一個文件中。
方案選擇...
template | 單文件 | render |
---|---|---|
一行的簡單結構 | 常規的選擇 | 前邊兩種方案解決不了時候的選擇(靈活性高) |
注意:
不論選擇哪一種方案,定義模板時,一定要有一個非template標簽元素作根DOM,有且僅有一個。
組件注冊方式 局部注冊以上幾種方案定義的組件本質上都是一個對象,獲取該對象(假設變量名為TabBar),要求只在另一個組件(假設變量名為App)內使用:
App組件的配置對象:
{ components:{ "tab-bar": TabBar, } }
這樣就是局部注冊,該組件TabBar只能在App模板中使用
以上幾種方案定義的組件本質上都是一個對象,獲取該對象(假設變量名為TabBar),要求項目內任何組件可使用:
一般在項目的入口文件(如:腳手架搭建項目的main.js)中:
Vue.component("tab-bar",TabBar);
這樣就是全局注冊,該組件TabBar能在整個項目內使用
以下用自己的語言將生命周期鉤子表述一下,如果有不對的地方,請校正:
beforeCreate在這個時候,生命周期函數已經準備好。
組件實例已經構建,但本組件實例的數據、方法還沒有注入;
可以在各個生命周期內通過組件實例this調用根實例上注入的$router、$store等對象。
可以在本生命周期內進行數據初始化;
created在這個時候,當前組件實例this上的屬性($data、props、$methods...)已經注入綁定,可以調用本實例上的成員屬性;
beforeMount在進入本生命周期之前,會進行以下判斷:
是否有el選項(指定掛載目標):
有el選項的是根實例;
沒有el選項的是非根實例(默認掛載元素為組件調用的位置);
是否有template選項:
有template選項的是內聯模板;
沒有template選項的是單文件組件;
個人覺得,還有render選項的判斷;
最終這些模板都會轉換為render函數進行渲染!!!
這個生命周期在解析模板,不知道有什么實際用途。
在本生命周期之前,已經將模板渲染為真實DOM,其中vm.$el為組件實例的根DOM元素;
本生命周期是初始化第三方插件的場所;
必要時候,可以在本生命周期內對DOM進行操作;
本生命周期是獲取this.$refs.ref的場所;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/96589.html
摘要:觸發事件可以攜帶數據,這些數據被用于傳遞給綁定了事件的其它組件的回調函數上,進而被傳遞給其它組件。父組件可以在回調函數里做任何事情,頗有靈活性。一般情況下,父組件會在回調函數中更新自己的狀態數據。 上一篇博文梳理了vue的數據驅動和響應式相關的特性,這一篇博文就來梳理vue的一個很重要的特性,組件化。自定義組件之于vue,其意義不亞于函數之于C,java之類的編程語言。函數是計算機科學...
摘要:事件總線事件總線首先創建了一個名為的空的實例然后全局定義了組件最后創建了實例。在父組件模板中,子組件標簽上使用指定一個名稱,并在父組件內通過來訪問指定名稱的子組件。 學習筆記:組件詳解 組件詳解 組件與復用 Vue組件需要注冊后才可以使用。注冊有全局注冊和局部注冊兩種方式。 全局注冊 Vue.component(my-component, {}); 要在父實例中使用這個組件,必須要...
閱讀 3797·2021-09-23 11:32
閱讀 2463·2021-09-06 15:01
閱讀 1623·2021-08-18 10:24
閱讀 3458·2019-12-27 11:44
閱讀 3609·2019-08-30 15:52
閱讀 2518·2019-08-30 11:11
閱讀 689·2019-08-29 17:27
閱讀 605·2019-08-29 16:22