vuejs中內置組件有:“<component/>”、“<keep-alive>”、“<transition/>”、“<transition-group/>”、“<slot/>”、“<teleport/>”。
本教程操作環境:windows7系統、vue2.9.6版,DELL G3電腦。
vue 內置組件
內置組件可以直接在模板中使用,而不需注冊。
<keep-alive>、<transition>、<transition-group> 和 <teleport> 組件都可以被打包工具 tree-shake。所以它們只會在被使用的時候被引入。如果你需要直接訪問它們,也可以將它們顯性導入。
// Vue 的 CDN 構建版本 const { KeepAlive, Teleport, Transition, TransitionGroup } = Vue
// Vue 的 ESM 構建版本 import { KeepAlive, Teleport, Transition, TransitionGroup } from 'vue'
<component> 和 <slot> 是模板語法中組件形式的特性。它們不是真正的組件且無法像上述組件那樣被導入。
下面給大家簡單介紹一下vuejs中的內置組件。
<component/>
多應用與創建動態組件
參數有 is 和inline-template,前者多為字符串或自定義組件,后者為布爾類型,
代碼示例
<template> <div class="hello"> <!-- 構建動態組件 --> <div :is="currentComp"></div> <!-- 按鈕點擊切換組件 --> <button v-on:click="changeComponent">改變組件</button> </div> </template> <script> //兩個自定義的組件 import login from '../components/login.vue' import index from '../components/index.vue' export default { name: 'BuildInComponent', components:{ index, login }, // 默認顯示index組件 data(){ return { currentComp:index } }, methods:{ changeComponent(){ if(this.currentComp == login){ this.currentComp = index }else { this.currentComp = login } } } } </script>
<keep-alive>
<keep-alive> 包裹動態組件時,會緩存不活動的組件實例,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個抽象組件:它自身不會渲染一個 DOM 元素,也不會出現在父組件鏈中。
此組件上的屬性有 include,exclude,max,前兩者為字符串或這則表達式,緩存/不緩存匹配到的組件,max表示最多可以緩存的組件數目。
匹配首先檢查組件自身的 name 選項,如果 name 選項不可用,則匹配它的局部注冊名稱 (父組件 components 選項的鍵值)。匿名組件不能被匹配。
此組件通常與v-show,v-if,v-else-if,v-else,is等包含條件的組件結合使用
代碼示例
<template> <div class="hello"> <!-- 使用keep-alive組件包裹其它條件渲染組件,不符合條件的則會被緩存,等下次條件成立時,則會立即渲染,提高渲染效率 --> <keep-alive> <div v-if="condition == 1"> <span>我是111111111111</span> </div> <div v-else-if="condition == 2"> <span>我是222222222222222</span> </div> <div v-else> <span>我是333333333333</span> </div> </keep-alive> </div> </template> <script> export default { name: 'BuildInComponent', data(){ return { condition:parseInt(Math.random()*3) } }, } </script>
<transition/>
添加被包裹元素的過渡效果,<transition> 元素作為單個元素/組件的過渡效果。<transition> 只會把過渡效果應用到其包裹的內容上,而不會額外渲染 DOM 元素,也不會出現在檢測過的組件層級中。
通常與v-show v-if is等組合使用;
有css過渡和js過渡
常用屬性:name:字符串,用于自動生成 CSS 過渡類名;css:布爾類型,是否使用 CSS 過渡類。默認為 true。如果設置為 false,將只通過組件事件觸發注冊的 JavaScript 鉤子
還可以通過enter-class,leave-class等屬性,自定義類名,通常在和第三方的動畫庫時結合使用;
- css過渡
css過渡的類名有transition屬性的name屬性值(記作v,若沒有name屬性值,則默認為v-),組合以下幾種構成:
- v-enter:定義進入過渡的開始狀態。在元素被插入之前生效,在元素被插入之后的下一幀移除。
- v-enter-active:定義進入過渡生效時的狀態。在整個進入過渡的階段中應用,在元素被插入之前生效,在過渡/動畫完成之后移除。這個類可以被用來定義進入過渡的過程時間,延遲和曲線函數。
- v-enter-to: 2.1.8版及以上 定義進入過渡的結束狀態。在元素被插入之后下一幀生效 (與此同時 v-enter 被移除),在過渡/動畫完成之后移除。
- v-leave: 定義離開過渡的開始狀態。在離開過渡被觸發時立刻生效,下一幀被移除。
- v-leave-active:定義離開過渡生效時的狀態。在整個離開過渡的階段中應用,在離開過渡被觸發時立刻生效,在過渡/動畫完成之后移除。這個類可以被用來定義離開過渡的過程時間,延遲和曲線函數。
- v-leave-to: 2.1.8版及以上 定義離開過渡的結束狀態。在離開過渡被觸發之后下一幀生效 (與此同時 v-leave 被刪除),在過渡/動畫完成之后移除。
代碼示例
<template> <div class="hello"> <!-- css過渡示例,transition組件 名稱為slide-fade, --> <div id="example-1"> <button @click="show = !show"> Toggle render </button> <transition name="slide-fade"> <p v-if="show">hello</p> </transition> </div> <!-- css動畫示例 --> <div id="example-2"> <button @click="show = !show">Toggle show</button> <transition name="bounce"> <p v-if="show">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.</p> </transition> </div> </div> </template> <script> export default { name: 'BuildInComponent', data(){ return { show: true } }, } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> /* 可以設置不同的進入和離開動畫 */ /* 設置持續時間和動畫函數 */ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-to /* .slide-fade-leave-active for below version 2.1.8 */ { transform: translateX(10px); opacity: 0; } /* 也可以使用css動畫 */ .bounce-enter-active { animation: bounce-in .5s; } .bounce-leave-active { animation: bounce-in .5s reverse; } @keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.5); } 100% { transform: scale(1); } } </style>
- js過渡
也可以在屬性中聲明 JavaScript 鉤子函數,在鉤子函數中,使用js進行動畫的操作;
當只用 JavaScript 過渡的時候,在 enter 和 leave 中必須使用 done 進行回調。否則,它們將被同步調用,過渡會立即完成
對于僅使用 JavaScript 過渡的元素添加 v-bind:css=“false”,Vue 會跳過 CSS 的檢測。這也可以避免過渡過程中 CSS 的影響。
// 使用js過渡,通常在組件中監聽事件,并寫好監聽到的回調函數即可<transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter" v-on:enter-cancelled="enterCancelled" v-on:before-leave="beforeLeave" v-on:leave="leave" v-on:after-leave="afterLeave" v-on:leave-cancelled="leaveCancelled"> <!-- ... --></transition>
<transition-group/>
Props:
-
tag – string – 如果未定義,則不渲染動畫元素。
-
move-class – 覆蓋移動過渡期間應用的 CSS 類。
-
除了 mode – 其他 attribute 和 <transition> 相同。
事件:
-
事件和 <transition> 相同。
用法:
<transition-group> 提供了多個元素/組件的過渡效果。默認情況下,它不會渲染一個 DOM 元素包裹器,但是可以通過 tag attribute 來定義。
注意,每個 <transition-group> 的子節點必須有獨立的 key,動畫才能正常工作。
<transition-group> 支持通過 CSS transform 過渡移動。當一個子節點被更新,從屏幕上的位置發生變化,它會被應用一個移動中的 CSS 類 (通過 name attribute 或配置 move-class attribute 自動生成)。如果 CSS transform property 是“可過渡” property,當應用移動類時,將會使用 FLIP 技術使元素流暢地到達動畫終點。
<transition-group tag="ul" name="slide"> <li v-for="item in items" :key="item.id"> {{ item.text }} </li> </transition-group>
<slot/>
vue的內容分發非常適合“固定部分+動態部分”的組件的場景,固定部分可以是結構固定,也可以是邏輯固定,比如下拉loading,下拉loading只是中間內容是動態的,而拉到底部都會觸發拉取