【實(shí)戰(zhàn)】Vue.js 中 v-if 和 v-show 的區(qū)別

一、業(yè)務(wù)需求


在一個(gè)擁有4個(gè)步驟的單向流程(Flow)中柿冲,需要在第2步展現(xiàn) A 組件,第4步展現(xiàn) B 組件兆旬,在第1、3步的時(shí)候隱藏組件怎栽。在有組件展示的步驟里丽猬,會(huì)傳給組件的4組不同的數(shù)據(jù)(param),組件需要根據(jù)傳入的數(shù)據(jù)做一些業(yè)務(wù)操作熏瞄。

二脚祟、需求分析


  1. 在同一個(gè)地方有組件間的切換,可采用動(dòng)態(tài)組件 component强饮。
  2. 對(duì)一個(gè)組件來(lái)說(shuō)由桌,當(dāng)傳入?yún)?shù)改變的時(shí)候,需要有相應(yīng)的動(dòng)作,所以可用 watcher 監(jiān)聽傳入的參數(shù)是否改變行您。
  3. 組件需要隱藏 / 顯示铭乾,可考慮使用 v-if 或者 v-show
  4. v-if 會(huì)重新創(chuàng)建組件(這是所謂開銷大的一方面),有些組件自己維護(hù)的狀態(tài)是不能保留的

三娃循、偽代碼


/*
 * A.vue
 * 組件A
 */
<template lang="pug">
div
  p {{param.text}}
</template>
<script>
export default {
  name: 'A',
  props: [ 'param' ],
  watch: {
    param: () => {
      ...
    }
  }
}
</script>

組件 B 和組件 A 類似炕檩,除了 name: 'B',所以略過(guò)了捌斧。

/*
 * Flow.vue
 */
<template lang="pug">
div
  div#container(v-if='show')
    component(
      :is='view' 
      :param='param'
    )
</template>

<script>
import A from 'A.vue'
import B from 'B.vue'

export default {
  name: 'Flow',
  components: { A, B },
  data() {
    return {
      show: false,
      view: null,
      param: null
    }
  },
  mounted() {
    this.view = 'A'
    setTimeout(() => {
      // 經(jīng)過(guò)1秒以后流程進(jìn)入第二步
      this.param = { ... } // 模擬第一次傳入數(shù)據(jù)
      this.show = true // 顯示組件
      // ... 其余步驟模擬略過(guò)
    }, 1000)
  }
}
</script>

當(dāng) Flowmounted 執(zhí)行的時(shí)候笛质,A 中的 param watcher 并不會(huì)被執(zhí)行;若把 Flow 中的 v-if 改成 v-show捞蚂,則 param watcher 會(huì)被執(zhí)行妇押。

四、分析


當(dāng)使用 v-show 的時(shí)候姓迅,this.view = 'A' 的時(shí)候舆吮,A 組件已經(jīng)完成了初始化(會(huì)觸發(fā) mounted),此時(shí) A 組件拿到的 paramnull队贱,所以當(dāng) paramFlow 中被賦值的時(shí)候色冀,會(huì)觸發(fā) watcher 事件。注意:在切換 view 的時(shí)候柱嫌,把新組件的一些初始化操作放到 vm.$nextTick 的回調(diào)里面锋恬。
而使用 v-if的話,A 組件的初始化會(huì)被延遲到 this.show = true 的時(shí)候编丘,此時(shí) A 組件拿到的 param 是已經(jīng)被賦過(guò)值的了与学。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嘉抓,隨后出現(xiàn)的幾起案子索守,更是在濱河造成了極大的恐慌,老刑警劉巖抑片,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵佛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡敞斋,警方通過(guò)查閱死者的電腦和手機(jī)截汪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)植捎,“玉大人衙解,你說(shuō)我怎么就攤上這事⊙媸啵” “怎么了蚓峦?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵舌剂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我暑椰,道長(zhǎng)霍转,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任干茉,我火速辦了婚禮谴忧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘角虫。我一直安慰自己沾谓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布均驶。 她就那樣靜靜地躺著妇穴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞒滴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天笤虫,我揣著相機(jī)與錄音耕皮,去河邊找鬼。 笑死罚拟,一個(gè)胖子當(dāng)著我的面吹牛拉队,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼与柑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舔稀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掌测,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體内贮,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年汞斧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夜郁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粘勒,死狀恐怖竞端,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庙睡,我是刑警寧澤事富,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布技俐,位于F島的核電站,受9級(jí)特大地震影響统台,放射性物質(zhì)發(fā)生泄漏雕擂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一贱勃、第九天 我趴在偏房一處隱蔽的房頂上張望井赌。 院中可真熱鬧,春花似錦贵扰、人聲如沸仇穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仪缸。三九已至,卻和暖如春列肢,著一層夾襖步出監(jiān)牢的瞬間恰画,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工瓷马, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拴还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓欧聘,卻偏偏與公主長(zhǎng)得像片林,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀骤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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