Vue學(xué)習(xí)筆記進(jìn)階篇——多元素及多組件過渡

本文為轉(zhuǎn)載趴久,原文:Vue學(xué)習(xí)筆記進(jìn)階篇——多元素及多組件過渡

多元素的過渡

對于原生標(biāo)簽可以使用 v-if/v-else.但是有一點需要注意:

當(dāng)有相同標(biāo)簽名的元素切換時,需要通過 key 特性設(shè)置唯一的值來標(biāo)記以讓 Vue 區(qū)分它們搔确,否則 Vue 為了效率只會替換相同標(biāo)簽內(nèi)部的內(nèi)容彼棍。即使在技術(shù)上沒有必要,給在 <transition> 組件中的多個元素設(shè)置 key 是一個更好的實踐膳算。

示例:

<transition>
  <button v-if="isEditing" key="save">
    Save
  </button>
  <button v-else key="edit">
    Edit
  </button>
</transition>

在一些場景中座硕,也可以給通過給同一個元素的 key特性設(shè)置不同的狀態(tài)來代替v-ifv-else,上面的例子可以重寫為:

<transition>
  <button v-bind:key="isEditing">
    {{ isEditing ? 'Save' : 'Edit' }}
  </button>
</transition>

使用多個 v-if 的多個元素的過渡可以重寫為綁定了動態(tài)屬性的單個元素過渡涕蜂。 例如:

<transition>
  <button v-if="docState === 'saved'" key="saved">
    Edit
  </button>
  <button v-if="docState === 'edited'" key="edited">
    Save
  </button>
  <button v-if="docState === 'editing'" key="editing">
    Cancel
  </button>
</transition>

可以重寫為:

<transition>
  <button v-bind:key="docState">
    {{ buttonMessage }}
  </button>
</transition>
computed: {
  buttonMessage: function () {
    switch (this.docState) {
      case 'saved': return 'Edit'
      case 'edited': return 'Save'
      case 'editing': return 'Cancel'
    }
  }
}

過渡模式

在元素之間的過渡中华匾,還存在一個問題:兩個元素都被重繪了,一個離開過渡的時候另一個開始進(jìn)入過渡机隙。這是 <transition>的默認(rèn)行為 - 進(jìn)入和離開同時發(fā)生蜘拉。
有一種最原始的解決方法就是,在元素絕對定位在彼此之上的時候運行正常有鹿。
還有一種方法就是使用Vue 提供的過渡模式.

in-out: 新元素先進(jìn)行過渡诸尽,完成之后當(dāng)前元素過渡離開。
out-in: 當(dāng)前元素先進(jìn)行過渡印颤,完成之后新元素過渡進(jìn)入。

out-in重寫之前的開關(guān)按鈕過渡:

<transition name="fade" mode="out-in">
  <!-- ... the buttons ... -->
</transition>

多元素過渡的例子

v-if和v-else的絕對定位實例

<div class="my-div" id="app">
    <transition name="fade">
        <button class="btn" :key="show" @click="show=!show">{{show ? 'on' : 'off'}}</button>
        <!--<button key="on" v-if="show" class="btn" @click="show = !show">on</button>-->
        <!--<button key="off" v-else class="btn" @click="show = !show">off</button>-->
    </transition>
</div>
        .my-div{
            position: relative;
        }
        .btn{
            position: absolute;
            left: 30px;
            top: 10px;
        }

        .fade-enter-active, .fade-leave-active{
            transition: opacity .5s;
        }
        .fade-enter, .fade-leave-to{
            opacity: 0;
        }
new Vue({
    el:'#app',
    data:{
        show : true
    }
})

多個v-if的例子

<div class="my-div" id="app">
    <transition name="fade">
        <button class="btn" :key="key" >{{btnContent}}</button>
    </transition>
</div>
        .my-div{
            position: relative;
        }
        .btn{
            position: absolute;
            left: 30px;
            top: 10px;
        }

        .fade-enter-active, .fade-leave-active{
            transition: opacity .5s;
        }
        .fade-enter, .fade-leave-to{
            opacity: 0;
        }
var app = new Vue({
    el:'#app',
    data:{
        key:'add'
    },
    computed:{
        btnContent:function () {
            switch (this.key){
                case 'add' : return 'Add'
                case 'edit' : return 'Edit'
                case 'delete' : return 'Delete'
            }
        }
    }
})

這里我沒有做對app.key的值的控制穿肄,所以想看過渡效果的話年局,可以在控制臺里修改app.key的值。

過渡模式的例子

<div id="app">
    <transition name="fade" mode="out-in">
        <button :key="show" @click="show=!show">{{show ? 'on' : 'off'}}</button>
    </transition>
</div>
        .fade-enter-active, .fade-leave-active{
            transition: opacity .5s;
        }
        .fade-enter, .fade-leave-to{
            opacity: 0;
        }
new Vue({
    el:'#app',
    data:{
        show : true
    }
})

多組件過渡

多個組件的過渡簡單很多 - 我們不需要使用 key 特性咸产。相反矢否,我們只需要使用動態(tài)組件,情況一下例子:

<div id="app">
    <transition name="fade" mode="out-in">
        <component :is="view"></component>
    </transition>
</div>
        .fade-enter-active, .fade-leave-active{
            transition: opacity .5s;
        }
        .fade-enter, .fade-leave-to{
            opacity: 0;
        }
var app = new Vue({
    el:'#app',
    data:{
        view:'v-a'
    },
    components:{
        'v-a':{
            template:'<div> component a </div>'
        },
        'v-b':{
            template:'<div> component b </div>'
        },
    }
})

在控制臺中修改app.view的值便可看到過渡效果脑溢。

以上示例中的過渡動畫僵朗,都可以自己定義赖欣,也可以使用上一節(jié)提到的自定義class已經(jīng)鉤子函數(shù)等,在這里就不做詳細(xì)介紹了验庙。

本文為轉(zhuǎn)載顶吮,轉(zhuǎn)載請注明出處
上一節(jié):Vue學(xué)習(xí)筆記進(jìn)階篇——單元素過度
返回目錄
下一節(jié):Vue學(xué)習(xí)筆記進(jìn)階篇——列表過渡及其他

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市粪薛,隨后出現(xiàn)的幾起案子悴了,更是在濱河造成了極大的恐慌,老刑警劉巖违寿,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湃交,死亡現(xiàn)場離奇詭異,居然都是意外死亡藤巢,警方通過查閱死者的電腦和手機(jī)搞莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂咒,“玉大人才沧,你說我怎么就攤上這事∏卫” “怎么了糜工?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長录淡。 經(jīng)常有香客問我捌木,道長,這世上最難降的妖魔是什么嫉戚? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任刨裆,我火速辦了婚禮,結(jié)果婚禮上彬檀,老公的妹妹穿的比我還像新娘帆啃。我一直安慰自己,他們只是感情好窍帝,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布努潘。 她就那樣靜靜地躺著,像睡著了一般坤学。 火紅的嫁衣襯著肌膚如雪疯坤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天深浮,我揣著相機(jī)與錄音压怠,去河邊找鬼。 笑死飞苇,一個胖子當(dāng)著我的面吹牛菌瘫,可吹牛的內(nèi)容都是我干的蜗顽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼雨让,長吁一口氣:“原來是場噩夢啊……” “哼雇盖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宫患,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤刊懈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娃闲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虚汛,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年皇帮,在試婚紗的時候發(fā)現(xiàn)自己被綠了卷哩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡属拾,死狀恐怖将谊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渐白,我是刑警寧澤尊浓,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站纯衍,受9級特大地震影響栋齿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟诸,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一瓦堵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歌亲,春花似錦菇用、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悍缠,卻和暖如春揩慕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扮休。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拴鸵,地道東北人玷坠。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蜗搔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親八堡。 傳聞我的和親對象是個殘疾皇子樟凄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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