Vue組件(sync語法糖)


為什么要用組件?
我們希望盡可能多的重用代碼
 
組件全局注冊:Vue.component('名字',{對象})

 

 注冊的組件里面包含了所有內容:數據(一定是函數,使用函數會形成閉包環境,保證了每一個組件擁有獨立得數據),模板,方法

 

組件注冊注意事項

1 data必須是一個函數

2 組件模板內容必須有單個根元素

3 組件模板內容可以是模板字符串

 

注意:如果采用駝峰命名,只能在字符串中使用駝峰樣式的名字,如果在普通模板中只能轉化為短橫線的方式,如下圖:

 

 

 

局部注冊:

 

 局部注冊的東西只能在注冊他的父組件中使用,其他地方不行

 
組件傳值
 父組件向子組件傳值:
 如下,都是以屬性的方式傳值,分為靜態傳值和動態傳值,靜態不加冒號,動態加冒號。
父組件:

 子組件通過props: [ ] 接收

子組件:

 

 完整演示

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<style type="text/css">
</style>
</head>
<body>
<div id="app">
<zu-jian title='靜態傳值' :name='msg'></zu-jian>
</div>
</body>
<script type="text/javascript">
Vue.component('zu-jian', {
props: ['title', 'name'],
template:`
<div>
{{title}}----
{{name}}
</div>
`
})
var vm = new Vue({
el: '#app',
data: {
msg: '動態傳值'
}
})
</script>
</html>

 props類型為數值與布爾時,如果不加不用v-bind(也就是不加:)做綁定,得到的都是字符串。

 
 props傳遞是單向的,只用於父傳值給子
 
 子組件像父組件傳數據
 子組件需要觸發一個自定義事件,父組件同時需要監聽自定義事件,當子組件觸發時,父組件監聽到就會執行相應的動作。
子組件:@click=$emit("自定義事件名", 參數 )
父組件 : @自定義事件名 = 自定義函數名($event)
父組件的methons :{ 自定義函數名: function(val) { val就是傳遞過來的值} }
【$emit 與 $event 是固定的寫法,不管你傳遞的時候有多少個參數,接收時都是$event , 然后函數中的形參也是一個】
【如果子組件傳遞有多個參數,就用對象的形式包起來。父組件接收時的形參也是單個參數,通過 .  的形式調用,例如:val.id , val.name】
一句話總結:點擊觸發$emit方法,並且攜帶參數,參數名稱就是自定義事件,這個事件會傳遞給父組件,父組件用@監聽一下
 
sync語法糖:
當遇到上面情況,子組件想改變父組件中的值,可以直接寫成:
子組件中寫成:this.$emit("'update:visable', false")      ------ visable是父組件中的值'update:visable'是固定寫法,傳false過去
父組件中寫成::visable.sync = "visable"
總結:這樣寫雖然子組件看不出簡化,但是使用父組件的人就用得很爽,不需要再@自定義事件名 = 自定義函數名($event),然后再父組件的methons去改變這個值
 
兄弟組件傳值(非父子組件傳值)https://www.bilibili.com/video/BV1vE411871g?p=63
 
組件插槽
就是可以往組件標簽的中間放一些自己寫的東西

最終模板會顯示:

ERROR: 有bug發生
ERROR: 有一個警告
 
作用域插槽:
作用:父組件對子組件內容進行加工處理
如果正常情況下顯示:

 

 現在要求對子組件的第二個li顯示為藍色。這時就用到了作用域插槽。

 

 通過slot傳值,父組件通過template中的slot-scope接收。這下面的{{item.name}}可刪可不刪。

 


免責聲明!

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



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