国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

在Vue中創(chuàng)建可重用的 Transition

開發(fā) 前端
如果我們可以將它們封裝到組件中,并在多個項目中簡單地重用它們,結果會怎樣呢?我們將介紹幾種定義transition的方法,并深入研究如何使它們真正可重用。

本文轉載自微信公眾號「大遷世界」,轉載本文請聯(lián)系大遷世界公眾號。

Vue.js中的transition確實很棒。毫無疑問,它們可以非常輕松地讓應用程序栩栩如生,但是通常必須在每個項目中從頭開始編寫它們,甚至還需要引入animate.css之類的CSS庫來使它們功能更強大。

如果我們可以將它們封裝到組件中,并在多個項目中簡單地重用它們,結果會怎樣呢?我們將介紹幾種定義transition的方法,并深入研究如何使它們真正可重用。

[[328523]]

原始transition組件和CSS

定義transition的最簡單方法是使用transition·或transition-group組件。這需要為transition定義一個name`和一些CSS。

  1. <template> 
  2.   <div id="app"> 
  3.     <button v-on:click="show = !show"> 
  4.       Toggle 
  5.     </button> 
  6.     <transition name="fade"> 
  7.       <p v-if="show">hello</p> 
  8.     </transition> 
  9.   </div> 
  10. </template> 
  11. <script> 
  12. export default { 
  13.   name: "App", 
  14.   data() { 
  15.     return { 
  16.       show: true 
  17.     }; 
  18.   } 
  19. }; 
  20. </script> 
  21. <style> 
  22. .fade-enter-active, 
  23. .fade-leave-active { 
  24.   transition: opacity 0.3s; 
  25. .fade-enter, 
  26. .fade-leave-to { 
  27.   opacity: 0; 
  28. </style> 

 

看起來容易,對吧?然而,這種方法有一個問題。我們不能在另一個項目中真正重用這個transition。

封裝transition組件

如果我們將前面的邏輯封裝到一個組件中,并將其用作一個組件,結果會怎樣呢?

  1. // FadeTransition.vue 
  2. <template> 
  3.   <transition name="fade"> 
  4.     <slot></slot> 
  5.   </transition> 
  6. </template> 
  7. <script> 
  8. export default { 
  9.    
  10. }; 
  11. </script> 
  12. <style> 
  13. .fade-enter-active, 
  14. .fade-leave-active { 
  15.   transition: opacity 0.3s; 
  16. .fade-enter, 
  17. .fade-leave-to { 
  18.   opacity: 0; 
  19. </style> 
  20.  
  21. // App.vue 
  22.  
  23. <template> 
  24.   <div id="app"> 
  25.     <button v-on:click="show = !show"> 
  26.       Toggle transition 
  27.     </button> 
  28.     <fade-transition> 
  29.       <div v-if="show" class="box"></div> 
  30.     </fade-transition> 
  31.   </div> 
  32. </template> 
  33. <script>...</script> 
  34. <style>...</style> 

通過在transition組件中提供一個slot,我們幾乎可以像使用基本transition組件一樣使用它。這比前面的例子稍微好一點,但是如果我們想要傳遞其他特定于transition的prop,比如mode或者一些hook,該怎么辦呢

封裝的包裝器transition組件

幸運的是,Vue 中有一個功能,使我們可以將用戶指定的所有額外props和監(jiān)聽器傳遞給我們的內部標簽/組件。如果你還不知道,則可以通過$attrs訪問額外傳遞的 props,并將它們與v-bind結合使用以將它們綁定為props。這同樣適用于通過$listeners進行的事件,并通過v-on對其進行應用。

  1. // FadeTransition.vue 
  2.  
  3. <template> 
  4.   <transition name="fade" v-bind="$attrs" v-on="$listeners"> 
  5.     <slot></slot> 
  6.   </transition> 
  7. </template> 
  8. <script> 
  9. export default {}; 
  10. </script> 
  11. <style> 
  12. .fade-enter-active, 
  13. .fade-leave-active { 
  14.   transition: opacity 0.3s; 
  15. .fade-enter, 
  16. .fade-leave-to { 
  17.   opacity: 0; 
  18. </style> 
  19.  
  20. // App.vue 
  21.  
  22. ... 
  23.  
  24. <fade-transition mode="out-in"> 
  25.   <div key="blue" v-if="show" class="box"></div> 
  26.   <div key="red" v-else class="red-box"></div> 
  27. </fade-transition> 
  28.  
  29. ... 
 
 

「完整事例地址:https://codesandbox.io/s/yjl1wjyoy1?from-embed」

現(xiàn)在,我們可以傳遞普通transition組件可以接受的任何事件和支持,這使得我們的組件更加可重用。但為什么不更進一步,增加通過 prop 輕松定制持續(xù)時間的可能性。

顯式持續(xù)時間 prop

Vue 為transition組件提供了一個duration prop,然而,它是為更復雜的動畫鏈接而設計的,它幫助 Vue 正確地將它們鏈接在一起。

在我們的案例中,我們真正需要的是通過組件prop控制CSS animation/transition。我們可以通過不在CSS中指定顯式的CSS動畫持續(xù)時間,而是將其作為樣式來實現(xiàn)。我們可以借助transition hook來做到這一點,該transition hook與組件生命周期 hook 非常相似,但是它們在過渡所需元素之前和之后被調用。讓我們看看效果如何。

  1. // FadeTransition.vue 
  2.  
  3. <template> 
  4.   <transition name="fade" 
  5.               enter-active-class="fadeIn" 
  6.               leave-active-class="fadeOut" 
  7.               v-bind="$attrs" 
  8.               v-on="hooks"> 
  9.       <slot></slot> 
  10.   </transition> 
  11. </template> 
  12. <script> 
  13. export default { 
  14.   props: { 
  15.     duration: { 
  16.       type: Number, 
  17.       default: 300 
  18.     } 
  19.   }, 
  20.   computed: { 
  21.     hooks() { 
  22.       return { 
  23.         beforeEnter: this.setDuration, 
  24.         afterEnter: this.cleanUpDuration, 
  25.         beforeLeave: this.setDuration, 
  26.         afterLeave: this.cleanUpDuration, 
  27.         ...this.$listeners 
  28.       }; 
  29.     } 
  30.   }, 
  31.   methods: { 
  32.     setDuration(el) { 
  33.       el.style.animationDuration = `${this.duration}ms`; 
  34.     }, 
  35.     cleanUpDuration(el) { 
  36.       el.style.animationDuration = ""
  37.     } 
  38.   } 
  39. }; 
  40. </script> 
  41. <style> 
  42. @keyframes fadeIn { 
  43.   from { 
  44.     opacity: 0; 
  45.   } 
  46.   to { 
  47.     opacity: 1; 
  48.   } 
  49. .fadeIn { 
  50.   animation-name: fadeIn; 
  51. @keyframes fadeOut { 
  52.   from { 
  53.     opacity: 1; 
  54.   } 
  55.   to { 
  56.     opacity: 0; 
  57.   } 
  58. .fadeOut { 
  59.   animation-name: fadeOut; 
  60. </style> 

 

「完整事例地址:https://codesandbox.io/s/j4qnjvmwz9?from-embed」

現(xiàn)在,我們可以控制實際的可見過渡時間,這使我們可重用的過渡變得靈活且易于使用。但是,如何過渡多個元素(如列表項)呢?

Transition group 支持

你想到的最直接的方法可能是創(chuàng)建一個新組件,比如fade-transition-group,然后將當前transition標簽替換為transition-group標簽,以實現(xiàn) group transition。如果我們可以在相同的組件中這樣做,并公開一個將切換到transition-group實現(xiàn)的group prop,那會怎么樣呢?幸運的是,我們可以通過render函數(shù)或component和is屬性來實現(xiàn)這一點。

  1. // FadeTransition.vue 
  2.  
  3. <template> 
  4.   <component :is="type" 
  5.              :tag="tag" 
  6.              enter-active-class="fadeIn" 
  7.              leave-active-class="fadeOut" 
  8.              move-class="fade-move" 
  9.              v-bind="$attrs" 
  10.              v-on="hooks"> 
  11.       <slot></slot> 
  12.   </component> 
  13. </template> 
  14. <script> 
  15. export default { 
  16.   props: { 
  17.     duration: { 
  18.       type: Number, 
  19.       default: 300 
  20.     }, 
  21.     group: { 
  22.       type: Boolean, 
  23.       default: false 
  24.     }, 
  25.     tag: { 
  26.       type: String, 
  27.       default: "div" 
  28.     } 
  29.   }, 
  30.   computed: { 
  31.     type() { 
  32.       return this.group ? "transition-group" : "transition"; 
  33.     }, 
  34.     hooks() { 
  35.       return { 
  36.         beforeEnter: this.setDuration, 
  37.         afterEnter: this.cleanUpDuration, 
  38.         beforeLeave: this.setDuration, 
  39.         afterLeave: this.cleanUpDuration, 
  40.         leave: this.setAbsolutePosition, 
  41.         ...this.$listeners 
  42.       }; 
  43.     } 
  44.   }, 
  45.   methods: { 
  46.     setDuration(el) { 
  47.       el.style.animationDuration = `${this.duration}ms`; 
  48.     }, 
  49.     cleanUpDuration(el) { 
  50.       el.style.animationDuration = ""
  51.     }, 
  52.     setAbsolutePosition(el) { 
  53.       if (this.group) { 
  54.         el.style.position = "absolute"
  55.       } 
  56.     } 
  57.   } 
  58. }; 
  59. </script> 
  60. <style> 
  61. @keyframes fadeIn { 
  62.   from { 
  63.     opacity: 0; 
  64.   } 
  65.   to { 
  66.     opacity: 1; 
  67.   } 
  68. .fadeIn { 
  69.   animation-name: fadeIn; 
  70. @keyframes fadeOut { 
  71.   from { 
  72.     opacity: 1; 
  73.   } 
  74.   to { 
  75.     opacity: 0; 
  76.   } 
  77. .fadeOut { 
  78.   animation-name: fadeOut; 
  79. .fade-move { 
  80.   transition: transform 0.3s ease-out; 
  81. </style> 
  82.  
  83. // App.vue 
  84.  
  85. ... 
  86.  
  87. <div class="box-wrapper"> 
  88.   <fade-transition group :duration="300"> 
  89.     <div class="box" 
  90.          v-for="(item, index) in list" 
  91.          @click="remove(index)" 
  92.          :key="item" 
  93.      > 
  94.     </div> 
  95.   </fade-transition> 
  96. </div> 
  97.  
  98. ... 

「完整事例地址:https://codesandbox.io/s/pk9r5j2257?from-embed」

 

[文檔中][6]介紹了一個帶有transition-group元素的警告。我們基本上必須在元素離開時將每個項目的定位設置為absolute,以實現(xiàn)其他項目的平滑移動動畫。我們也必須添加一個move-class并手動指定過渡持續(xù)時間,因為沒有用于移動的 JS hook。我們將這些調整添加到我們的上一個示例中。

再做一些調整,通過在mixin中提取 JS 邏輯,我們可以將其應用于輕松創(chuàng)建新的transition組件,只需將其放入下一個項目中即可。

Vue Transition

在此之前描述的所有內容基本上都是這個小型 [transition 集合][7]所包含的內容。它有 10 個封裝的transition組件,每個約1kb(縮小)。我認為它非常方便,可以輕松地在不同的項目中使用。你可以試一試:)

總結

我們從一個基本的過渡示例開始,并最終通過可調整的持續(xù)時間和transition-group支持來創(chuàng)建可重用的過渡組件。我們可以使用這些技巧根據(jù)并根據(jù)自身的需求創(chuàng)建自己的過渡組件。希望讀者從本文中學到了一些知識,并且可以幫助你們建立功能更好的過渡組件。

 

 

 

 

 

責任編輯:趙寧寧 來源: 大遷世界
相關推薦

2023-10-17 07:23:00

Vue組件代碼

2024-06-13 10:11:33

WPFCommand命令模式

2024-01-03 08:00:00

Java軟件開發(fā)代碼

2011-07-21 13:24:14

java

2023-11-08 13:55:27

2018-11-08 15:50:18

前端Javascript重用性

2011-04-12 16:01:04

MySQL查詢編寫

2010-06-09 09:15:58

JSF 2Ajax組件

2013-04-23 09:14:22

可重用云工具Java安全框架云中間件

2013-04-23 09:24:51

2013-12-04 14:19:40

JavaScript代碼重用

2011-07-12 15:45:29

java

2023-06-15 09:02:14

Python模塊和包

2009-06-23 14:18:00

Java代碼可重用性

2021-06-26 06:29:14

Vue 2Vue 3開發(fā)

2021-08-28 10:06:29

VueJavascript應用

2022-07-05 09:27:35

Iframe前端平臺架構

2024-06-28 01:13:59

工具C#代碼

2020-11-02 11:33:52

ReactVue應用

2020-10-30 12:44:05

USBLinux
點贊
收藏

51CTO技術棧公眾號

欧美性受黑人性爽| 一区二区精品在线| 三妻四妾完整版在线观看电视剧 | 日本人妖在线| 欧美国产综合色视频| 狠狠色噜噜狠狠色综合久| 欧美亚洲激情| 欧美一级大胆视频| 欧美视频二区欧美影视| 有码中文亚洲精品| 奇米777日韩| 日韩精品在线免费播放| gogo高清在线播放免费| 亚洲福利精品在线| 福利在线免费视频| 精品偷拍各种wc美女嘘嘘| 2001个疯子在线观看| 亚洲成人网久久久| 国产乱妇乱子在线播视频播放网站| 欧美综合在线视频| 国产玉足榨精视频在线观看| 婷婷久久综合九色国产成人| 亚洲高清福利| 欧美日韩五月天| 欧美久久久久久久久久| 操操操综合网| 亚洲大片精品永久免费| 免费女人黄页| 亚洲综合无码一区二区| 色播在线观看| 在线免费视频一区二区| 欧美激情二区| 亚洲国产精品高清久久久| zzzwww在线看片免费| 亚洲一级片在线看| 国产视频网站一区二区三区| 国语自产精品视频在线看抢先版图片 | 老色鬼久久亚洲一区二区| 日本一区二区三区视频在线播放 | 久久一区二区三区四区| 自慰无码一区二区三区| 中文字幕一区二区三区不卡在线 | 天堂在线中文网官网| 日韩专区在线播放| 国产在线播放精品| 成人av色在线观看| 美女诱惑黄网站一区| 大陆极品少妇内射aaaaaa| 久久精品亚洲乱码伦伦中文 | 成人羞羞视频免费| 久久久久免费| 久久久久久久久久久视频| 亚洲日本一区二区| 91在线观看| 日韩亚洲欧美中文高清在线| 欧美日韩国产一区二区三区不卡| 国产私拍一区| 97久久超碰国产精品| 最色在线观看| 亚洲美女自拍视频| 亚洲第一二三区| 神马影院午夜我不卡| 久久蜜桃av一区二区天堂| 中文在线最新版天堂8| 欧美精品一区二区久久婷婷 | 久久亚洲精品国产亚洲老地址| 精品国产91| 色综合电影网| 日韩毛片精品高清免费| 欧美被日视频| 欧美激情亚洲国产| 亚洲精品欧美| 三级a三级三级三级a十八发禁止| 欧美性猛交xxx| 懂色aⅴ精品一区二区三区| 国产精品久久久久福利| 日韩中文字幕麻豆| 日本激情免费| 国产视频在线一区二区| 成年人视频免费在线观看| 精品久久久久久电影| 羞羞视频在线免费看| 日韩一区二区三区视频在线观看| 91麻豆免费在线视频| 一区二区三欧美| 同性恋视频一区| 91精品国产综合久久香蕉的用户体验| 欧美一区二区三区激情视频| 国产一区二区三区黄| 视频一区视频二区中文字幕| 国产99久久九九精品无码| 狠狠躁天天躁日日躁欧美| 99riav视频在线观看| 韩国19禁主播vip福利视频| 香蕉精品999视频一区二区| 熟女少妇在线视频播放| 欧美日韩国产高清一区二区| 手机看片福利盒子久久| 欧美日韩免费观看一区二区三区 | 亚洲精品免费在线看| 一区二区三区小说| 自拍偷自拍亚洲精品被多人伦好爽| 国产日韩欧美黄色| 久久综合九色综合欧美就去吻| 欧美大片黄色| 国产精品h片在线播放| 成人精品视频.| 欧美人与牲禽动交com| 91九色综合久久| 成人欧美一区二区三区| 国产精品1区在线| 男人天堂网站在线| 欧美一级生活片| 影音先锋亚洲电影| 一级片在线视频| 青青久久aⅴ北条麻妃| 久久一区二区三区四区| 巨胸喷奶水www久久久免费动漫| 欧美日韩精品免费观看视一区二区| 欧美日韩精品在线观看| 国产在线观看91一区二区三区 | 蜜臀久久99精品久久久久久9| 欧美女同网站| 91精品国产综合久久久久久蜜臀 | 一本在线高清不卡dvd| 精品淫伦v久久水蜜桃| av观看免费在线| 日韩亚洲第一页| 国产aⅴ综合色| 日本电影欧美片| 99视频精品全部免费看| 日韩三级免费观看| 中文一区在线| 黄视频网站在线| 国产在线一区二区三区播放| 欧美丝袜丝交足nylons| 精品999网站| 成人在线观看免费网站| 日本不卡一区二区三区在线观看| 日韩写真欧美这视频| 日韩av网站免费在线| 国产黄色大片在线观看| 致1999电视剧免费观看策驰影院| 精品亚洲国产成av人片传媒| 国产激情视频一区二区在线观看| 黄色在线观看www| 欧美大黑帍在线播放| 中文欧美日本在线资源| 国产福利一区在线观看| 日韩色性视频| 成人图片小说| 国产精品专区一| 欧美这里有精品| 老司机午夜精品视频| 一区二区三区四区日本视频| 欧美 日韩 亚洲 一区| 日韩中文字幕在线看| 中文字幕第一区| 欧美影院三区| 日本韩国在线视频爽| 中文字幕精品—区二区日日骚| 中文字幕精品一区久久久久| 欧美国产97人人爽人人喊| 色爱综合网欧美| 97caopor国产在线视频| 欧美精品一区二区性色a+v| 久久精品成人一区二区三区| 日韩美女视频一区二区| 综合一区在线| 福利成人导航| 成人3d动漫一区二区三区| 日韩免费视频在线观看| 精品视频在线免费| 国产成人aaa| 欧美理论视频| 成人性生交大片免费看在线播放| 日韩av片在线看| 亚洲va男人天堂| 亚洲激情在线观看视频免费| 国产亚洲综合性久久久影院| 亚洲国产精品久久久久蝴蝶传媒| 黄网av在线| 欧美黄色性生活| 国产91亚洲精品一区二区三区| 亚洲人成网7777777国产| 亚洲精品视频在线观看网站| 久久一区国产| 欧美18免费视频| 日本精品600av| 免费激情视频在线观看| 成人在线观看网址| 中文字幕亚洲一区| 一本色道久久综合亚洲91| 国产成人av电影在线播放| 久久一区91| www.成人爱| 日韩欧美在线观看一区二区| 给我免费播放片在线观看| 高清国产一区| 高清欧美性猛交|