Vue/組件

Vue/組件

創(chuàng)建組件

單獨(dú)聲明一個(gè)Vue.component,使用只需要在Vue實(shí)例下使用定義的組件名

在組件中data不能是一個(gè)對(duì)象谷醉,而必須是一個(gè)函數(shù)辆亏,這個(gè)函數(shù)返回一個(gè)對(duì)象

全局組件

<div id='#app'>
    <my-component></my-component>  
</div>

Vue.component('my-component',{
  data(){
    return {
      name: 'sss'
    }
  },
  template: `<div>我的第一個(gè)組件 - {{name}}}</div>`
})
//my-component 聲明的組件名  
//template 組件的模板

局部組件

放在實(shí)例的對(duì)象components下杂瘸,使用只能在實(shí)例el下使用

let vm = new Vue({
  el: '#app2',
  components: {
    "child-component": {
       template: `<div>局部組件 - {{name}}}</div>`
    }
  }  
})

組件通信

props down, events up,

父組件傳遞給子組件數(shù)據(jù),通過屬性傳遞翔曲,子組件傳遞給父組件數(shù)據(jù),通過事件傳遞


<div id="app">
  <my-component food="西瓜"></my-component>
</div>
Vue.component('my-component',{
  props:['food'], //一個(gè)子組件需要通過props中的獲得父組件傳遞的屬性信息
  template: `<div><p>{{food}}</p></div>`
})

//獲取實(shí)例下數(shù)據(jù)
<div id="app">
    <my-component v-bild:food="foods"></my-component>
</div>
Vue.component('my-component',{
  props:["food"],
  template:`
    <div>
        <p>{{food}}</p>
    </div>
    `,
})

new Vue({
  el: '#app',
  data: {
    foods: "蘋果"
  }
})

//蘋果

子組件可以接收來自父組件的數(shù)據(jù)劈愚,為了保證數(shù)據(jù)的正確性瞳遍,完整性,安全性菌羽,vue會(huì)禁止直接修改父組件的數(shù)據(jù)掠械,如果非要更改這個(gè)數(shù)據(jù),一定要通過事件的方式通知父組件

比如上面的我們?cè)谀0嫦露x一個(gè)按鈕注祖,當(dāng)點(diǎn)擊的時(shí)候

<div id="app3">
     <my-component :data="foods" @edit-data="callback"></my-component>
</div>
Vue.component('my-component',{
        props:["data"],
        template:`
                <div>
                    <p>{{data}}</p>
                    <button @click="click">按鈕</button>  
                </div>
        `,
        methods: {
            click(){
                this.$emit('edit-data',"我要吃蘋果")
                //點(diǎn)擊后赦邻,觸發(fā)事件
            }
        }
      })
    let vm = new Vue({
        el: '#app3',
        data: {
            foods:
                "蘋果"
        },
        methods: {
            callback(v){
                //這邊就監(jiān)聽到后,相當(dāng)于子組件要請(qǐng)求修改數(shù)據(jù)晚顷,通過事件傳遞給父組件家凯,然后告訴實(shí)例,實(shí)例自己來修改數(shù)據(jù)署鸡,最后影響到數(shù)據(jù)的更改
                this.foods = v;
            }
        }
    })
    console.log(vm.foods)

props驗(yàn)證

我們可以為組件的 props 指定驗(yàn)證規(guī)格案糙。如果傳入的數(shù)據(jù)不符合規(guī)格,Vue 會(huì)發(fā)出警告靴庆。當(dāng)組件給其他人使用時(shí),要指定驗(yàn)證規(guī)格时捌,需要用對(duì)象的形式,而不能用字符串?dāng)?shù)組:

//在props里通過一個(gè)對(duì)象來給props來限制條件
Vue.component('example', {
  props: {
    // 基礎(chǔ)類型檢測(cè) (`null` 意思是任何類型都可以)
    propA: Number,
    // 多種類型
    propB: [String, Number],
    // 必傳且是字符串
    propC: {
      type: String,
      required: true
    },
    // 數(shù)字炉抒,有默認(rèn)值
    propD: {
      type: Number,
      default: 100
    },
    // 數(shù)組/對(duì)象的默認(rèn)值應(yīng)當(dāng)由一個(gè)工廠函數(shù)返回
    propE: {
      type: Object,
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定義驗(yàn)證函數(shù)
    propF: {
      validator: function (value) {
        return value > 10
      }
    }
  }
})

非prop屬性

如果一個(gè)組件標(biāo)簽上的屬性沒有在props中定義奢讨,那么這個(gè)屬性將會(huì)被自動(dòng)添加到組件的根元素上,對(duì)于style和class進(jìn)行合并(把組件標(biāo)簽上的style或class與區(qū)間根元素上的style或class進(jìn)行合并)焰薄,但是其他的屬性將是覆蓋操作


//div background: red; border: 1px solid #000;<div id="app">
    <m-area style="border: 1px solid #000" :r="100"></m-area>
</div>

Vue.component("mArea",{
    props: {
        r: {
            type: Number,
            default: 10
        }
    },
    template: `
        <div style="background: red">  
            <p>面積: {{Math.PI * r * r}}</p>
        </div>
    `
});

let vm = new Vue({
    el: "#app"
})  
//div background: red; border: 1px solid #000;

style標(biāo)簽并沒有在props中定義拿诸,那就會(huì)自動(dòng)添加在組件模版根元素(div)上,style這個(gè)屬性也不是被覆蓋塞茅,而是合并在一起了

插槽slot

在組件模板中通過 <slot></slot> 來定義一個(gè)插槽亩码,在解析的時(shí)候,會(huì)把對(duì)應(yīng)的內(nèi)容放到slot位置

一個(gè)組件中可以使用多個(gè)slot野瘦,如果有多個(gè)的話描沟,需要給slot設(shè)置name屬性飒泻,沒有name的就是默認(rèn)插槽

<div id="app">
  <h1>自身h1標(biāo)題</h1>
  <my-component>
  <p>自身的文字</p>
  <p>自身的文字1111</p>
  </my-component>
</div>

Vue.component('my-component',{
  template:`
  <div>
  <p>模版文字</p>
  <span>moban</span>
  <slot>slot的文字</slot> 
  </div>
`
});
//如果外面使用模版,有模版以為的內(nèi)容吏廉,看里面是否有插槽泞遗,有就把外面自身的內(nèi)容放到插槽位置里,沒有內(nèi)容就是用插槽的內(nèi)容

具名

<slot> 元素可以用一個(gè)特殊的屬性 name 來配置如何分發(fā)內(nèi)容席覆。多個(gè) slot 可以有不同的名字史辙。具名 slot 將匹配內(nèi)容片段中有對(duì)應(yīng) slot 特性的元素。

仍然可以有一個(gè)匿名 slot娜睛,它是默認(rèn) slot髓霞,作為找不到匹配的內(nèi)容片段的備用插槽。如果沒有默認(rèn)的 slot畦戒,這些找不到匹配的內(nèi)容片段將被拋棄方库。

<div id="app">
    <my-component>
        <p>沒有固定要放的位置</p>
        <h1 slot="head">我要放的自己的頭部?jī)?nèi)容</h1>
        <p>沒有固定要放的位置111</p>
        <p slot="foot">我要放的自己的底部?jī)?nèi)容</p>
        <p slot="head">我要放的自己的頭部?jī)?nèi)容111</p>
    </my-component>
 </div>

Vue.component('my-component',{
template:`
    <div>
        <header>
            <slot name="head"></slot>    
        </header>
        <main>
            <slot></slot>
        </main>
        <footer>
            <slot name="foot"></slot>    
        </footer>
</div>
                `
});  

//展示
<div>
    <header>
        <h1>我要放的自己的頭部?jī)?nèi)容</h1>
        <p>我要放的自己的頭部?jī)?nèi)容111</p>
    </header>
    <main>
        <p>沒有固定要放的位置</p>
        <p>沒有固定要放的位置111</p>
    </main>
    <footer>
        <p>我要放的自己的底部?jī)?nèi)容</p> 
    </footer>
</div>

作用域插槽

作用域插槽是一種特殊類型的插槽,用作使用一個(gè) (能夠傳遞數(shù)據(jù)到) 可重用模板替換已渲染元素障斋。

在父級(jí)中纵潦,具有特殊屬性 scope<template> 元素必須存在,表示它是作用域插槽的模板垃环。scope 的值對(duì)應(yīng)一個(gè)臨時(shí)變量名邀层,此變量接收從子組件中傳遞的 props 對(duì)象:

<div id="app">
  <div class="parent">
    <my-component>
      <template scope="props"> 
        <span>{{props.text}}</span>
      </template>
    </my-component>
  </div>
</div>

Vue.component('my-component',{
    template:`
        <div class="child">
            <slot a=10></slot>
            <slot b=10></slot>
            <slot age="18"></slot>
            <slot text="hello from child"></slot>
        </div>
`
});
//相當(dāng)于循環(huán)了模版里的內(nèi)容,你有幾個(gè)slot就循環(huán)幾次遂庄,那就是4個(gè)span標(biāo)簽寥院,內(nèi)容就用{{props.需要的屬性}},沒有就為空標(biāo)簽
//展現(xiàn)
<div class="parent">
    <div class="child">
        <span></span>
        <span></span>
        <span></span>
        <span>hello from child</span>
    </div>
</div>

具名作用域

<div id="app">
    <my-component>
        <template scope="props" slot="list">  //
            <li>{{props.text}}</li>
        </template>
    </my-component>
</div>

Vue.component('my-component',{
    template:`
        <ul>
            <slot name="list" v-for="item in items" :text="item"></slot>
        </ul>
`

new Vue({
    el: '#app',
    data: {
        items: ["a","b","c","d","e"]
    }
})

//顯示
<ul>
    <li>a</li>
    <li>b</li>
    <li>c</li>
    <li>d</li>
    <li>e</li>
</ul>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涛目,一起剝皮案震驚了整個(gè)濱河市秸谢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌估蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沫换,死亡現(xiàn)場(chǎng)離奇詭異臭蚁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讯赏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門垮兑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱挎,你說我怎么就攤上這事甥角。” “怎么了识樱?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我怜庸,道長(zhǎng)当犯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任割疾,我火速辦了婚禮嚎卫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宏榕。我一直安慰自己拓诸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布麻昼。 她就那樣靜靜地躺著奠支,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抚芦。 梳的紋絲不亂的頭發(fā)上倍谜,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音叉抡,去河邊找鬼尔崔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褥民,可吹牛的內(nèi)容都是我干的季春。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼消返,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼载弄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侦副,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侦锯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秦驯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺碰,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年译隘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亲桥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡固耘,死狀恐怖题篷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厅目,我是刑警寧澤番枚,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布法严,位于F島的核電站,受9級(jí)特大地震影響葫笼,放射性物質(zhì)發(fā)生泄漏深啤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一路星、第九天 我趴在偏房一處隱蔽的房頂上張望溯街。 院中可真熱鬧,春花似錦洋丐、人聲如沸呈昔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堤尾。三九已至,卻和暖如春九榔,著一層夾襖步出監(jiān)牢的瞬間哀峻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工哲泊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剩蟀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓切威,卻偏偏與公主長(zhǎng)得像育特,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子先朦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 三缰冤、組件 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML元素喳魏,封裝可重用...
    小山居閱讀 613評(píng)論 0 1
  • 此文基于官方文檔棉浸,里面部分例子有改動(dòng),加上了一些自己的理解 什么是組件刺彩? 組件(Component)是 Vue.j...
    陸志均閱讀 3,833評(píng)論 5 14
  • 前言 本文主要介紹屬性迷郑、事件和插槽這三個(gè)vue基礎(chǔ)概念、使用方法及其容易被忽略的一些重要細(xì)節(jié)创倔。如果你閱讀別人寫的組...
    IT小鮑閱讀 465評(píng)論 0 0
  • 測(cè)試代碼 創(chuàng)鍵組件 兩種方式:方法一:使用Vue.extend({}) 方法二:使用字面量 注冊(cè)組件 全局注冊(cè)語法...
    放風(fēng)箏的小小馬閱讀 552評(píng)論 0 0
  • 今天的軍訓(xùn)沒有之前那么累嗡害,可能是下雨一直休息的原因,感覺濟(jì)南下雨的時(shí)候真是少畦攘。 昨晚夢(mèng)到我躺在家里大床上睡覺霸妹,...
    微Rain閱讀 219評(píng)論 0 0