vue2.6已經更新了關於內容插槽和作用域插槽的api和用法,為了不誤導大家,我把插槽的內容刪除了。詳情請看官網
2018-07-19更新:
更新作用域插槽的屬性:scope
->slot-scope
;
新增了物件解構。
今天看了下vue官網上關於元件的教程,感覺內容還挺多,現在把元件中基本的知識梳理一下。
註冊元件就是利用vue.component()
方法,先傳入乙個自定義元件的名字,然後傳入這個元件的配置。
vue.component('mycomponent',}})
如上方式,就已經建立了乙個自定義元件,然後就可以在vue例項掛在的dom元素中使用它。
mycomponent>
my-component>
div>
data: ,
components: }})
直接使用vue.component()
建立的元件,所有的vue例項都可以使用。還可以在某個vue例項中註冊只有自己能使用的元件。
data: ,
components: }})
注意:元件的模板只能有乙個根元素。下面的情況是不允許的。
template: `這是乙個區域性的自定義元件,只能在當前vue例項中使用
hello`,
可以看出,註冊元件時傳入的配置和建立vue例項差不多,但也有不同,其中乙個就是data
屬性必須是乙個函式。
這是因為如果像vue例項那樣,傳入乙個物件,由於js中物件型別的變數實際上儲存的是物件的引用
,所以當存在多個這樣的元件時,會共享資料,導致乙個元件中資料的改變會引起其他元件資料的改變。
而使用乙個返回物件的函式,每次使用元件都會建立乙個新的物件,這樣就不會出現共享資料的問題來了。
當使用 dom 作為模版時 (例如,將 el 選項掛載到乙個已存在的元素上), 你會受到 html 的一些限制,因為 vue 只有在瀏覽器解析和標準化 html 後才能獲取模板內容。尤其像這些元素其中,前兩個模板都不是vue官方推薦的,所以一般情況下,只有單檔案元件.vue
可以忽略這種情況。
在html中使用元素,會有一些屬性,如class
,id
,還可以繫結事件,自定義元件也是可以的。當在乙個元件中,使用了其他自定義元件時,就會利用子元件的屬性和事件來和父元件進行資料交流。
如上如所示,父子元件之間的通訊就是 props down,events up,父元件通過 屬性props向下傳遞資料給子元件,子元件通過 事件events 給父元件傳送訊息。
比如,子元件需要某個資料,就在內部定義乙個prop
屬性,然後父元件就像給html元素指定特性值一樣,把自己的data屬性傳遞給子元件的這個屬性。
而當子元件內部發生了什麼事情的時候,就通過自定義事件來把這個事情涉及到的資料暴露出來,供父元件處理。
"baz" v-on:event-a="dothis(arg1,...arg2)">my-component>
如上**,
過程就是這樣:
vue元件通過props
屬性來宣告乙個自己的屬性,然後父元件就可以往裡面傳遞資料。
vue.component('mycomponent',}
', props: ['mymessage'],
data () }})
然後呼叫該元件
mycomponent>
div>
注意,由於html特性是不區分大小寫的,所以傳遞屬性值時,mymessage
應該轉換成 kebab-case (短橫線隔開式)my-message="hello"
。
這裡說一下v-bind
繫結屬性值的乙個特性:一般情況下,使用v-bind
給元素特性(attribute)傳遞值時,vue會將""
中的內容當做乙個表示式。
比如:
hellodiv>
元素的上面這樣,div
attr
特性值就是message
。而這樣
"message">hello
這裡的message
應該是vue例項的data的乙個屬性,這樣div
元素的attr
特性值就是message
這個屬性的值。
之所以說是一般情況,是因為class
和style
特性並不是這樣。用v-bind:class
和class
傳入正常的類名,效果是一樣的,因為對於這兩個特性,vue採用了合併而不是替換的原則。
根據上面,想要把父元件的屬性繫結到子元件,應該使用v-bind
,這樣,父元件中資料改變時能反映到子元件。
注意,根據父元件傳遞給子元件的屬性型別的不同,當在子元件中更改這個屬性時,會有以下兩種情況:
一般來說,是不建議在子元件中對父元件中傳遞來的屬性進行操作的。如果真的有這種需求,可以這樣:
父元件傳遞了乙個基本型別值,那麼可以在子元件中建立乙個新的屬性,並以傳遞進來的值進行初始化,之後就可以操作這個新的屬性了
props: ['initialcounter'],
data: function ()
}
父元件傳遞了乙個引用型別值,為了避免更改父元件中相應的資料,最好是對引用型別進行複製。複雜的情況,肯定應該是深複製。
同樣是上面的原因,靜態的給子元件的特性傳遞值,它都會把他當做乙個字串。
comp>
子元件中,特性的值是字串 "1" 而不是 number 1。如果想傳遞正確的數值,應該使用v-bind
傳遞,這樣就能把傳遞的值當做乙個表示式來處理,而不是字串。
comp>
我們可以給元件的props
屬性新增驗證,當傳入的資料不符合要求時,vue會發出警告。
vue.component('example', ,
// 數字,有預設值
propd: ,
// 陣列/物件的預設值應當由乙個工廠函式返回
prope: }},
// 自定義驗證函式
propf:
}}})
type
可以是下面原生構造器:
type
也可以是乙個自定義構造器函式,使用instanceof
檢測。
// 自定義person構造器
function person(name, age)
vue.component('my-component', }, 年齡: }
`, props: }})
new vue(
})
也可以像在html標籤中新增data-
開頭的自定義屬性一樣,給自定義元件新增任意的屬性。而不僅限於data-*
形式,這樣做的話,vue會把這個屬性放在自定義元件的根元素上。乙個自定義元件的模板只能有乙個根元素。
如果父元件向子元件的非prop屬性傳遞了值,那麼這個值會覆蓋子元件模板中的特性。
my-component2>
div>
也可以直接繫結到元件物件上:
var home =
new vue(
})
如果把切換出去的元件保留在記憶體中,可以保留它的狀態或避免重新渲染。為此可以新增乙個keep-alive
指令引數:
component>
keep-alive>
Vue元件的理解
template模板和dom同時寫,template模板會覆蓋當前這個dom節點,要有根節點包裹 元件化的優點 1.可以復用,2.降低 的耦合性。src檔案會整個打包成乙個js檔案 模板 編譯 ast 資料 render函式 虛擬dom 真實html 直接寫render函式會減少編譯過程,提高效率,...
Vue元件理解
1 關於元件 元件可以擴充套件html元素,封裝可重用的 註冊全域性元件 vue.component tagname,options 的形式。如 template this is my componentdiv 元件註冊需要在初始化根例項之前進行,即先註冊元件,再初始化vue例項。對元件進行註冊之後...
深刻理解Vue中的元件
今天看了下vue官網上關於元件的教程,感覺內容還挺多,現在把元件中基本的知識梳理一下。註冊元件就是利用vue.component 方法,先傳入乙個自定義元件的名字,然後傳入這個元件的配置。vue.component mycomponent 如上方式,就已經建立了乙個自定義元件,然後就可以在vue例項...