Element分析(組件篇)——Alert

index.js

常規(guī)做法沟启,添加install方法來方便作為插件使用忆家。

import Alert from './src/main';

Alert.install = function(Vue) {
  Vue.component(Alert.name, Alert);
};

export default Alert;

整體

首先分析一下其模板結(jié)構(gòu)德迹。

<template>
  <transition name="el-alert-fade">
    <div class="el-alert" :class="[ typeClass ]" v-show="visible">
      <i class="el-alert__icon" :class="[ iconClass, isBigIcon ]" v-if="showIcon"></i>
      <div class="el-alert__content">
        <span class="el-alert__title" :class="[ isBoldTitle ]" v-if="title">{{ title }}</span>
        <slot>
          <p class="el-alert__description" v-if="description">{{ description }}</p>
        </slot>
        <i class="el-alert__closebtn" :class="{ 'is-customed': closeText !== '', 'el-icon-close': closeText === '' }" v-show="closable" @click="close()">{{closeText}}</i>
      </div>
    </div>
  </transition>
</template>

最外層transition

首先,最外層是一個名為el-alert-fade的過渡動畫胳搞,查詢發(fā)現(xiàn),它只是簡單的改變了透明度肌毅。

<transition name="el-alert-fade">
</transition>
  .el-alert-fade-enter,
  .el-alert-fade-leave-active {
    opacity: 0;
  }````

## el-alert包裹
然后,里面是一層`el-alert 類`的`div`用來包裹整個組件悬而,其中一個屬性是根據(jù)傳遞`props`的`type`類型改變樣式呜舒,另一個是根據(jù)`visible`決定是否顯示笨奠。

```html
<div class="el-alert" :class="[ typeClass ]" v-show="visible">
</div>

type是一個計算屬性,代碼如下:

props: {
  type: {
    type: String,
    default: 'info'
  }
}

computed: {
  typeClass() {
    return `el-alert--${ this.type }`;  // 根據(jù)傳遞的type返回不同的類
  }
}

再往里面般婆,是一個i標(biāo)簽和一個div標(biāo)簽到腥,前者是相應(yīng)的圖標(biāo)腺兴,后者是警告具體的內(nèi)容。

圖標(biāo)

圖標(biāo)通過兩個類控制樣式页响,它們都是計算屬性,其中iconClass決定圖標(biāo)類型闰蚕,isBigIcon決定圖標(biāo)大小栈拖,而showIcon是傳遞來的props決定是否顯示這個圖標(biāo)没陡。其代碼如下:

<i class="el-alert__icon" :class="[ iconClass, isBigIcon ]" v-if="showIcon"></i>
props: {
  showIcon: {
    type: Boolean,
    default: false
  }
}

computed: {
  iconClass() {
    return TYPE_CLASSES_MAP[this.type] || 'el-icon-information';
  },

  isBigIcon() {
    return this.description ? 'is-big' : '';
  }
}

其中TYPE_CLASSES_MAP是一個常量對象,用來做map盼玄,根據(jù)傳遞的type來決定相應(yīng)的類名。

const TYPE_CLASSES_MAP = {
  'success': 'el-icon-circle-check',
  'warning': 'el-icon-warning',
  'error': 'el-icon-circle-cross'
};

isBigIcon是根據(jù)props中的description來決定的埃儿,當(dāng)存在描述內(nèi)容的時候就使用大的圖標(biāo)器仗。

props: {
  description: {
    type: String,
    default: ''
  },
}

主體內(nèi)容

接下來是主要的內(nèi)容部分,包括標(biāo)題威鹿、內(nèi)容和關(guān)閉按鈕三個部分。

標(biāo)題

標(biāo)題是由名為titleprop來決定的轨香,包含一個isBoldTitle的計算屬性來決定是否粗體,以及根據(jù)title是否存在來決定是否顯示這一部分臂容。

<span class="el-alert__title" :class="[ isBoldTitle ]" v-if="title">{{ title }}</span>
computed: {
  isBoldTitle() {
    return this.description ? 'is-bold' : '';
  }
}

警告描述

然后是最為主要的描述部分,這部分是一個slot脓杉,這使得炸渡,這一部分可以自定義丽已,也可以通過傳遞description這一prop來決定內(nèi)容买决。

<slot>
  <p class="el-alert__description" v-if="description">{{ description }}</p>
</slot>

關(guān)閉按鈕

最后是關(guān)閉按鈕的實現(xiàn)。

<i
  class="el-alert__closebtn"
  :class="{ 'is-customed': closeText !== '', 'el-icon-close': closeText === '' }"
  v-show="closable"
  @click="close()">
  {{closeText}}
</i>

不難看出督赤,做了如下處理:

  1. 存在closeText這一prop的內(nèi)容的話嘁灯,會自定義關(guān)閉內(nèi)容躲舌;
  2. 會根據(jù)closable這一prop決定是否顯示該關(guān)閉按鈕;
  3. 綁定單擊時觸發(fā)事件close()

其中closeTextclosable的代碼如下:

props: {
  closable: {
    type: Boolean,
    default: true
  },
  closeText: {
    type: String,
    default: ''
  },
}

close會將visible設(shè)置為false從而關(guān)閉該警告没卸,并且觸發(fā)close事件。

methods: {
  close() {
    this.visible = false;
    this.$emit('close');
  }
},
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末约计,一起剝皮案震驚了整個濱河市诀拭,隨后出現(xiàn)的幾起案子煤蚌,更是在濱河造成了極大的恐慌,老刑警劉巖尉桩,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜘犁,居然都是意外死亡翰苫,警方通過查閱死者的電腦和手機沽瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門农尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盛卡,你說我怎么就攤上這事≈欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵巍实,是天一觀的道長滓技。 經(jīng)常有香客問我棚潦,道長,這世上最難降的妖魔是什么丸边? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮妹窖,結(jié)果婚禮上纬朝,老公的妹妹穿的比我還像新娘骄呼。我一直安慰自己,他們只是感情好蜓萄,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布隅茎。 她就那樣靜靜地躺著绕德,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耻蛇。 梳的紋絲不亂的頭發(fā)上踪蹬,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天臣咖,我揣著相機與錄音,去河邊找鬼夺蛇。 笑死疚漆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闻镶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丸升,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狡耻?” 一聲冷哼從身側(cè)響起墩剖,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤岭皂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沼头,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡进倍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了背捌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毡庆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烙如,到底是詐尸還是另有隱情么抗,我是刑警寧澤亚铁,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站徘溢,受9級特大地震影響吞琐,放射性物質(zhì)發(fā)生泄漏然爆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一曾雕、第九天 我趴在偏房一處隱蔽的房頂上張望奴烙。 院中可真熱鬧,春花似錦揩环、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翘单。三九已至吨枉,卻和暖如春哄芜,著一層夾襖步出監(jiān)牢的瞬間貌亭,已是汗流浹背认臊。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留失晴,地道東北人剧腻。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓涂屁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拆又。 傳聞我的和親對象是個殘疾皇子儒旬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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