Vue組件化

一泰偿、組件注冊(cè)使用

組件使用步驟

(全局組件)
①創(chuàng)建組件構(gòu)造器

//構(gòu)造組件方式一
const cpn = Vue.extend({
    template:`
        <div>
            <h1>注冊(cè)的組件</h1>
        </div>
    `
})

②注冊(cè)組件

Vue.component('mycpn',cpn)

③使用組件 在vue實(shí)例對(duì)象管理的 中才能夠使用

<div id="app">
    <mycpn></mycpn>
</div>

(局部組件)

//構(gòu)造組件方式二
<template id="cpn">
    <div>
        <h1>注冊(cè)的組件</h1>
    </div>
</template>
const app = new Vue({
    el: '#app',
    data: {
    
    },
    components: {
          mycpn: '#cpn'
    }
})

(父子組件)
①構(gòu)造子組件

<template id="son_cpn">
    <div>
        <h1>注冊(cè)的子組件</h1>
    </div>
</template>

②父組件中注冊(cè)子組件

const father_cpn = Vue.extend({
    template:`
        <div>
            <h1>注冊(cè)的父組件</h1>
            <son-cpn></son-cpn>
        </div>`,
     components:{
          'son-cpn': '#son_cpn' //注冊(cè)子組件
     }
})

③注冊(cè)父組件

const app = new Vue({
    el: '#app',
    data: {
    
    },
    components: {
          'father-cpn': father_cpn 
    }
})

④使用

<div id="app">
    <father-cpn></father-cpn>
    <son-cpn></son-cpn>//無(wú)法解析,子組件只在父組件中注冊(cè)
</div>

語(yǔ)法糖

①方式1

Vue.component('cpn',{
    template:`
        <div>
            <h1>注冊(cè)的組件</h1>
        </div>
    `
})

②方式2

<template id="cpn">
    <div>
        <h1>注冊(cè)的組件</h1>
    </div>
</template>
const app = new Vue({
    el: '#app',
    data: {
    
    },
    components: {
        cpn: {
             template: '#cpn'
         }
    }
})

二案糙、組件間的通信

父?jìng)髯?/h3>

父?jìng)髯拥耐ㄐ磐ㄟ^(guò)props

<div id="app">
    <cpn :msg="father_msg"></cpn>
</div>
<template id="cpn">
<div>
    <h1>{{msg}}</h1>
</div>
</template>
//子組件
const cpn = {
    template: '#cpn',
    data(){
        return {}
    },
    props: [ 'msg' ] //定義一個(gè)msg變量 與子組件上綁定的變量一致
    /*props對(duì)象寫(xiě)法
    props: {
        msg:{
            type: String,
            default: '默認(rèn)數(shù)據(jù)'  //父組件沒(méi)傳值時(shí)顯示
        }
        //or
        msg: String
   }
    */
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {
         father_msg:'父組件的數(shù)據(jù)'
    },
    components: {
        cpn
    }
})

子傳父

子傳父的通信通過(guò)自定義事件

<div id="app">
    <cpn @fatherclick="fatherclick"></cpn>
</div>
<template id="cpn">
<div>
    <h1>子組件內(nèi)容</h1>
    <button @click="sonclick">傳數(shù)據(jù)給父組件</button>
</div>
</template>
//子組件
const cpn = {
    template: '#cpn',
    data(){
        return {
            son_msg: '子組件的數(shù)據(jù)'
        }
    },
    methods:{
        sonclick(){
            this.$emit('fatherclick',this.son_msg) //發(fā)射fatherclick事件检盼,并在組件上監(jiān)聽(tīng)該事件
        }
    }
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {
         
    },
    methods:{
        fatherclick(data){
            console.log(data)  //打印 ‘子組件的數(shù)據(jù)’
        }
    },
    components: {
        cpn
    }
})

父訪(fǎng)問(wèn)子

通過(guò)$children阵具、$refs訪(fǎng)問(wèn)

<div id="app">
    <cpn ref="a"></cpn>
    <cpn ref="b"></cpn>
    <button @click="getchildren">訪(fǎng)問(wèn)子組件</button>
</div>
<template id="cpn">
<div>
    <h1>子組件內(nèi)容</h1>
</div>
</template>
//子組件
const cpn = {
    template: '#cpn',
    data(){
        return {
            son_msg: '子組件的數(shù)據(jù)'
        }
    },
    methods:{
        
    }
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {
         father_msg: '父組件的數(shù)據(jù)'
    },
    methods:{
        getchildren(){
             console.log(this.$children)  //不常用 輸出一個(gè)對(duì)象Array
             console.log(this.$refs)  //常用拇泣,需要在子組件上設(shè)置ref屬性 
            //輸出 {a:{...},b:{...}}
        }
    },
    components: {
        cpn
    }
})

子訪(fǎng)問(wèn)父

通過(guò)$root$parent訪(fǎng)問(wèn)

<div id="app">
    <cpn></cpn>
</div>
<template id="cpn">
<div>
    <h1>子組件內(nèi)容</h1>
    <button @click="getparent">訪(fǎng)問(wèn)父組件</button>
</div>
</template>
//子組件
const cpn = {
    template: '#cpn',
    data(){
        return {
            son_msg: '子組件的數(shù)據(jù)'
        }
    },
    methods:{
        getparent(){
            console.log(this.$parent)  //父組件對(duì)象Array
            console.log(this.$root)  //獲取根組件對(duì)象
        }
    }
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {
         father_msg: '父組件的數(shù)據(jù)'
    },
    methods:{
      
    },
    components: {
        cpn
    }
})

三渐裂、slot插槽

使用slot可以讓組件具有擴(kuò)展性,更靈活

具名插槽

<div id="app">
    <cpn-box>
        <cpn-left slot="left"/>
        <cpn-center slot="center"/>
         <cpn-right slot="right"/>
    </cpn-box>
</div>

<template id="cpn-box">
<div>
    <h1>子組件盒子內(nèi)容</h1>
<!-- slot屬性對(duì)應(yīng)name進(jìn)行替換 沒(méi)有slot屬性的會(huì)替換所有沒(méi)有name屬性的插槽!-->
    <slot name="left"><span>默認(rèn)左</span></slot>
    <slot name="center"><span>默認(rèn)中</span></slot>
    <slot name="right"><span>默認(rèn)右</span></slot>
</div>
</template>

<template id="cpn-left">
<div>
    <h1>子組件-左</h1>
</div>
</template>

<template id="cpn-center">
<div>
    <h1>子組件-中</h1>
</div>
</template>

<template id="cpn-right">
<div>
    <h1>子組件-右</h1>
</div>
</template>
//子組件
const cpnbox = {
    template: '#cpn-box'
}
const cpnleft = {
    template: '#cpn-left'
}
const cpncenter = {
    template: '#cpn-center'
}
const cpnright = {
    template: '#cpn-right'
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {    
    },
    components: {
        'cpn-box': cpnbox,
        'cpn-left': cpnleft,
        'cpn-center': cpncenter,
        'cpn-right': cpnright,
    }
})

作用域插槽

使用子組件的data數(shù)據(jù)進(jìn)行插槽需要使用作用域插槽豺旬,否則取不到
先用v-bind對(duì)插槽綁定數(shù)據(jù),再使用<template slot-scope="slotObj"></template>來(lái)獲取slotObj(插槽對(duì)象)進(jìn)而獲取對(duì)應(yīng)數(shù)據(jù)

<div id="app">
    <cpn></cpn>
    <cpn>
      <template slot-scope="slotObj"> 
        <p>{{slotObj.data}}</p>
      </template>
    </cpn>
</div>
<template id="cpn">
<div>
    <h1>子組件內(nèi)容</h1>
    <slot :data="msg">
        <span>{{msg}}</span>
    </slot>
</div>
</template>
//子組件
const cpn = {
    template: '#cpn',
    data(){
        return {
            msg: '子組件的數(shù)據(jù)'
        }
    }
}
//父組件實(shí)例
const app = new Vue({
    el: '#app',
    data: {
    },
    components: {
        cpn
    }
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柒凉,一起剝皮案震驚了整個(gè)濱河市族阅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膝捞,老刑警劉巖耘分,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绑警,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)央渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)计盒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芽丹,你說(shuō)我怎么就攤上這事北启。” “怎么了拔第?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵咕村,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蚊俺,道長(zhǎng)懈涛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任泳猬,我火速辦了婚禮批钠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘得封。我一直安慰自己埋心,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布忙上。 她就那樣靜靜地躺著拷呆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茬斧,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天腰懂,我揣著相機(jī)與錄音,去河邊找鬼啥供。 笑死悯恍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伙狐。 我是一名探鬼主播涮毫,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贷屎!你這毒婦竟也來(lái)了罢防?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唉侄,失蹤者是張志新(化名)和其女友劉穎咒吐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體属划,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恬叹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同眯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绽昼。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖须蜗,靈堂內(nèi)的尸體忽然破棺而出硅确,到底是詐尸還是另有隱情,我是刑警寧澤明肮,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布菱农,位于F島的核電站,受9級(jí)特大地震影響柿估,放射性物質(zhì)發(fā)生泄漏循未。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一官份、第九天 我趴在偏房一處隱蔽的房頂上張望只厘。 院中可真熱鬧,春花似錦舅巷、人聲如沸羔味。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赋元。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搁凸,已是汗流浹背媚值。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留护糖,地道東北人褥芒。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嫡良,于是被迫代替她去往敵國(guó)和親锰扶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351