Vue筆記-2.發(fā)布訂閱

前言

什么叫做發(fā)布訂閱,簡單來說就是爺爺楣铁、爸爸和孫子祖孫三代的通信
現(xiàn)在有個(gè)需求癌瘾,做個(gè)tabs

image.png
image.png

思路如下所示:

image.png

首先會創(chuàng)建五個(gè)組件瓮下,它們分別是tabs(爺爺)翰铡,head(大兒子),item(大兒子的兒子們)讽坏,body(二兒子)和pane(二兒子的兒子們)

一開始item1 是亮著的锭魔,那么pane也應(yīng)該是亮著的。倘若這時(shí)候要是點(diǎn)擊了item2路呜,怎么通知到pane2呢迷捧?

第一種方法是:一開始從爺爺這通知,看紅色箭頭胀葱,這時(shí)候點(diǎn)擊ietm2,看藍(lán)色箭頭漠秋,通知head,關(guān)閉item1抵屿,在返回tabs改變selected=item2庆锦,在通知body,關(guān)閉pane1轧葛,并點(diǎn)亮pane2搂抒。(麻煩)

第二種方法就是 發(fā)爺爺艇搀、爸爸和孫子祖孫三代的通信 布訂閱
另外再做一個(gè)變量,名為EventBus求晶,當(dāng)我點(diǎn)擊了item2的時(shí)候焰雕,這時(shí)候通知EventBus,由EventBus通知tabs芳杏,更改selected=item2矩屁。點(diǎn)擊item3,方法如上蚜锨。

實(shí)例

index.html

<div id="app">
    <!--<g-tabs :selected="selectedTab" @update:selected="selectedTab =$event">-->
    <g-tabs :selected.sync="selectedTab" @update:selected="yyy">
        <g-tabs-head>
            <template slot="actions">
                <button>設(shè)置</button>
            </template>
            <g-tabs-item name="woman">
                <g-icon name="setting"></g-icon>
                美女
            </g-tabs-item>
            <g-tabs-item name="finance" disabled>
                財(cái)經(jīng)
            </g-tabs-item>
            <g-tabs-item name="sports">
                體育
            </g-tabs-item>
        </g-tabs-head>

        <g-tabs-body>
            <g-tabs-pane name="woman">
                美女相關(guān)資訊
            </g-tabs-pane>
            <g-tabs-pane name="finance">
                財(cái)經(jīng)相關(guān)資訊
            </g-tabs-pane>
            <g-tabs-pane name="sports">
                體育相關(guān)資訊
            </g-tabs-pane>
        </g-tabs-body>
    </g-tabs>
</div>

tabs.vue

<template>
    <div class="tabs">
        <slot></slot>
    </div>

</template>
                 
<script>
    import Vue from 'vue'

    export default {
        name: "GuLuTabs",
        props: {
            selected: {
                type: String,
                required: true, // 必須輸入 selected 這個(gè)值档插,如果沒有輸入也會在控制臺顯式報(bào)錯(cuò)
            },
            direction: {
                type: String,
                default: 'horizontal',
                validator(value) {
                    // return ['horizontal', 'vertical'].includes(value)
                    return ['horizontal', 'vertical'].indexOf(value) > -1;
                }
            }
        },
        data() {
            return {
                eventBus: new Vue
            }
        },
        provide() {
            // 事件中心,訂閱發(fā)布
            return {
                eventBus: this.eventBus
            }
        },
        mounted() {
            // this.$emit('update:selected','這是一個(gè) this.$emit 出來的數(shù)據(jù)');
            this.eventBus.$emit('update:selected',this.selected);
            // this.$emit('update:selected','xxx')
        },
        created() {
            this.$emit('update:selected','這是一個(gè) this.$emit 出來的數(shù)據(jù)');
            this.eventBus.$emit('update:selected','this.eventBus.$emit 出來的數(shù)據(jù)');
            // this.$emit('update:selected','xxx')
        }
    }
</script>

<style scoped lang="scss">
    .tabs {

    }

</style>

解析:

  • 這里面的selected是選擇哪個(gè)item亚再,是必須要輸入的值郭膛,這里面的要接收前端開發(fā)者傳來的值,所以放在props中氛悬,另一點(diǎn)是required的含義是:不允許為空则剃,必須傳值進(jìn)來
  • includes 和 indexof 的區(qū)別
    includes 不支持IE 傳的值是布爾型
    indexof 支持IE 結(jié)果是數(shù)值
  • data和props的區(qū)別
  • provide()與inject
    其余的子組件中必須要有 inject
開始的寫法
<script>
        data() {
            return {
            }
        },
        provide() {
            // 事件中心,訂閱發(fā)布
            return {
                eventBus: new Vue
            }
        },
        created() {
            console.log("EventBus");
            this.$emit(this.eventBus);
            console.log("this");
            this.$emit(this);
        },
</script>

在瀏覽器中運(yùn)行后如捅,發(fā)現(xiàn)打印出來的值沒有eventBus棍现,于是將new Vue 聲明在 data(){}里面

image.png
image.png

body和head的寫法

<template>
    <div class="tabs-body">
        <slot></slot>
    </div>

</template>

<script>
    export default {
        name: "GuLuTabsBody",
        inject: ['eventBus'],
        created() {

        }

    }
</script>

<style scoped lang="scss">
    .tabs-body {

    }
</style>

----------------------------

<script>
    export default {
        name: "GuLuTabsHead",
        inject: ['eventBus'],
        created() {

        }

    }
</script>

item和pane的寫法

<template>
    <div class="tabs-item" @click="xxx" :class="classes">
        <slot></slot>
    </div>

</template>

<script>
    export default {
        name: "GuLuTabsItem",
        inject: ['eventBus'], // 不需要用戶傳值,自身維護(hù)值
        data() {
            return {
                active: false
            }
        },
        props: {
            disabled: {
                type: Boolean,
                default: false
            },
            name: {
                type: String | Number,
                required: true
            }
        },
        computed:{
            classes(){
                return{
                    active:this.active
                }
            }
        },
        created() {
            this.eventBus.$on('update:selected', (name) => {
                this.active = name === this.name ? true : false;
            });
        },
        methods: {
            xxx() {
                this.eventBus.$emit('update:selected', this.name)
            }
        }

    }
</script>

<style scoped lang="scss">
    .tabs-item {
        flex-shrink: 0; /*指定了 flex 元素的收縮規(guī)則*/
        padding: 0 1em; /*用em就是不關(guān)心隔了多少像素镜遣,就關(guān)心字和字之間是否隔得開*/
        &.active{
            background: red;
        }
    }
</style>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末己肮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悲关,更是在濱河造成了極大的恐慌谎僻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寓辱,死亡現(xiàn)場離奇詭異艘绍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秫筏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門诱鞠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人这敬,你說我怎么就攤上這事航夺。” “怎么了崔涂?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵阳掐,是天一觀的道長。 經(jīng)常有香客問我,道長锚烦,這世上最難降的妖魔是什么觅闽? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮涮俄,結(jié)果婚禮上蛉拙,老公的妹妹穿的比我還像新娘。我一直安慰自己彻亲,他們只是感情好孕锄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苞尝,像睡著了一般畸肆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宙址,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天轴脐,我揣著相機(jī)與錄音,去河邊找鬼抡砂。 笑死大咱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的注益。 我是一名探鬼主播碴巾,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丑搔!你這毒婦竟也來了厦瓢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤啤月,失蹤者是張志新(化名)和其女友劉穎煮仇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顽冶,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年售碳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强重。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贸人,死狀恐怖间景,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艺智,我是刑警寧澤倘要,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響封拧,放射性物質(zhì)發(fā)生泄漏志鹃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一泽西、第九天 我趴在偏房一處隱蔽的房頂上張望曹铃。 院中可真熱鬧,春花似錦捧杉、人聲如沸陕见。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽评甜。三九已至,卻和暖如春仔涩,著一層夾襖步出監(jiān)牢的瞬間忍坷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工熔脂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留承匣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓锤悄,卻偏偏與公主長得像韧骗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子零聚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348