VUE-組件

組件

????????組件就是為了拆分Vue實例的代碼量的骤视,能夠讓我們以不同的組件來劃分不同的功能模塊,將來我們需要什么樣的功能白群,就可以去調(diào)用對應(yīng)的組件即可尚胞。

組件化和模塊化的不同

模塊化:是從代碼邏輯的角度進行劃分的,方便代碼分層開發(fā)帜慢,保證每個功能模塊的職能單一笼裳;

組件化:是從UI界面的角度進行劃分的,前端的組件化方便UI組件的重用粱玲。

全局組件

直接在script標簽中定義躬柬,和new Vue平級,不需要再進行注冊抽减,可以直接在html標簽中使用

        //全局組件
        Vue.component('todo-list',{
            template:"<li>全局組件</li>"   
  這個地方也可以寫成”#tem”   然后在vue實例#app的外面書寫html代碼<template id=’tem’></template>
        })
<todo-list></todo-list>
局部組件

直接在script標簽中定義允青,和new Vue平級,只是定義了一個變量卵沉,需要進行注冊

        //局部組件颠锉,定義完之后要在Vue中的components注冊一下
        var TodoItem = {    
            props:['content'],
            template:'<li v-on:click="clickAler">{{content}}</li>'
            methods:{
                clickAler:function(e){
                    // alert(this.content);
                    this.$emit('delete',this.index);
//子組件向外發(fā)布一個delete事件,并攜帶數(shù)據(jù)this.index
                }
            }

        }
        new Vue({
            el:'#root',                           //掛載點:el參數(shù)對應(yīng)的dom標簽
            // template:'<h1>hello {{msg}}</h1>',    //模板:掛載點內(nèi)部的內(nèi)容
   // 如果一個vue實例沒有template史汗,那么它就會找掛載點琼掠,并把掛載點下面的DOM當(dāng)做一個模板
            components:{
              'todo-item': TodoItem
            },
            data: {                               //vue實例里面的數(shù)據(jù)
                msg:'hello ffff',
                num:123,
                list:['第一個','第二個','第三個'],
                inputValue:'',
                inputList:[]
            },
            methods:{
                commit:function(){
                    this.inputList.push(this.inputValue);
                    this.inputValue = '';
                }
            }
        })
<todo-item v-for='(item,index) in inputList' 
v-bind:key='index' v-bind:content='item'  
v-bind:index='index'
v-on:delete='deleteItem'
 ></todo-item>

????????組件名稱使用了駝峰命名,則在引用組件的時候需要把大寫的駝峰改為小寫的字母停撞,同時兩個單詞之間使用‘-’連接瓷蛙;如果不適用駝峰,則直接拿名稱來使用戈毒。
????????組件中的data必須是一個function并return數(shù)據(jù)對象艰猬,這樣才能保證這個組件在不同的地方使用的時候數(shù)據(jù)不會實現(xiàn)共享,每個組件之間的數(shù)據(jù)是獨立的埋市。

render渲染組件
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
  render:function(createElements){
    return createElements(login)
  }
})

在這個vue實例中只能渲染login這個組件冠桃,其他標簽不會顯示。
也可以寫成render:h=>h(login)恐疲,將h作為createElements的別名腊满,返回h(login)即為createElements(login)

組件切換

方式一:

if-else

方式二:

使用component標簽

        <a href="" @click.prevent="comName='login'"></a>
        <a href="" @click.prevent="comName='register'"></a>
        <component :is="comName"></component>
組件傳值

????????在組件的使用時,可以給組件傳值培己,首先給組件綁定一個變量content碳蛋,里面存放的值對應(yīng)的是inputList的item,然后在組件的定義中添加props:[‘content’]省咨,這樣在組件的模板中就可以使用content傳過來值了肃弟。

????????其實每一個vue組件就相當(dāng)于一個vue實例,那么#root對應(yīng)的vue實例也就是一個父組件,也就相當(dāng)于在父組件中使用了子組件笤受。如果一個vue實例沒有template穷缤,那么就會去找它的掛載點,掛載點下面的所有DOM標簽就是對應(yīng)的模板箩兽,這樣就解釋了后面我們編程的時候津肛,每個子組件我們都給一個文件存放,并且不寫template標簽汗贫。一個實例就對以一個組件身坐。

父組件向子組件傳值

????????父組件可以在引用子組件的時候通過屬性綁定(****v-bind:****)的形式把需要傳遞給子組件的數(shù)據(jù)傳遞過去。

v-bind:content='item'

????????把inputList數(shù)組中的item作為一個屬性content傳遞給todo-item這個子組件落包,在子組件的props屬性中添加這個屬性”content”部蛇,這樣就可以在子組件中使用這個數(shù)據(jù)了。

方式一:使用props向子組件傳值

(content是屬性咐蝇,item是父組件要傳的數(shù)據(jù)涯鲁,在子組件的props中用content接收這個數(shù)據(jù))

父組件:

image.png

子組件:
image.png

????????在子組件中,data中的數(shù)據(jù)是可讀可寫的有序,props中的數(shù)據(jù)是只讀的
????????父組件也可以向子組件傳遞方法抹腿,但是是用v-on:進行綁定的,v-on:func123=’parentFun’旭寿,在子組件中使用這個方法是用this.
emit(‘func123’)幢踏,如果這個方法有傳參,那么子組件在調(diào)用的時候直接在this.
emit(‘func123’)方法名后面接參數(shù)许师,this.
emit(‘func123’,arg1,arg2…),就相當(dāng)于子組件向父組件傳參僚匆。 方式二:使用
emit
父組件:
image.png

子組件:
image.png

子組件向父組件傳值

通過發(fā)布訂閱的方式

????????子組件首先發(fā)布一個事件delete并攜帶一個數(shù)據(jù)this.$emit(‘delete’,this.index)微渠,在父組件中訂閱了這個delete事件,并用方法deleteItem來接受子組件傳過來的事件返回咧擂,v-on:delete=’deteleItem’逞盆,這樣在deleteItem方法的參數(shù)中便可以得到子組件傳過來的this.index數(shù)據(jù)。

????????本質(zhì)上是父組件定義了一個帶參數(shù)的方法松申,并把這個方法傳遞給了子組件云芦,當(dāng)子組件調(diào)用這個方法的時候把自己的數(shù)據(jù)當(dāng)做實參傳入這個方法,父組件就相當(dāng)于通過這個方法拿到了子組件的數(shù)據(jù)贸桶。

子組件:同樣是childEvent事件舅逸,只不過子組件攜帶了參數(shù)


image.png

父組件:
image.png

和之前父組件向子組件不同的是,parentMethod有返回e皇筛,這個e就是子組件傳過來的值
父組件可以通過this.refs獲取子組件的方法琉历、數(shù)據(jù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旗笔,隨后出現(xiàn)的幾起案子彪置,更是在濱河造成了極大的恐慌,老刑警劉巖蝇恶,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拳魁,死亡現(xiàn)場離奇詭異,居然都是意外死亡撮弧,警方通過查閱死者的電腦和手機潘懊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想虎,“玉大人卦尊,你說我怎么就攤上這事∩喑” “怎么了岂却?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裙椭。 經(jīng)常有香客問我躏哩,道長,這世上最難降的妖魔是什么揉燃? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任扫尺,我火速辦了婚禮,結(jié)果婚禮上炊汤,老公的妹妹穿的比我還像新娘正驻。我一直安慰自己,他們只是感情好抢腐,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布姑曙。 她就那樣靜靜地躺著,像睡著了一般迈倍。 火紅的嫁衣襯著肌膚如雪伤靠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天啼染,我揣著相機與錄音宴合,去河邊找鬼。 笑死迹鹅,一個胖子當(dāng)著我的面吹牛卦洽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斜棚,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼逐样,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脂新,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤挪捕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后争便,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體级零,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年滞乙,在試婚紗的時候發(fā)現(xiàn)自己被綠了奏纪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡斩启,死狀恐怖序调,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔簇,我是刑警寧澤发绢,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站垄琐,受9級特大地震影響边酒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狸窘,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一墩朦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翻擒,春花似錦氓涣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恩伺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椰拒,已是汗流浹背晶渠。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留燃观,地道東北人褒脯。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缆毁,于是被迫代替她去往敵國和親番川。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容