您好,登錄后才能下訂單哦!
針對Vue文檔中部分大家可能不會去研讀的內容,我做了個小總結,作為有經驗者的快餐,不是特別適合初學者,可能有不妥之處,希望大家多提建議。
節省代碼量的mixin
mixin概念:組件級可復用邏輯,包括數據變量/生命周期鉤子/公共方法,從而在混入的組件中可以直接使用,不用重復寫冗余邏輯(類似繼承)
使用方法:
在某一公共文件夾pub下創建mixin文件夾,其下創建mixinTest.js
const mixinTest = { created() { console.log(`components ${this.name} created`) }, methods: { hello() { console.log('mixin method hello') } } } export default mixinTest
在組件中引用剛才的公共混入文件并使用
import mixinTest from '../pub/mixin/mixinTest.js' export default { data() { return { name: 'hello' } }, mixins: [mixinTest], methods: { useMixin() { this.hello() } } }
ps: 若是使用Vue.mixin()這個方法,則會影響之后創建的所有Vue示例,慎用!
注意mixin的幾個特性:
slot內容分發
slot概念引入:Vue跟React在寫法上的不同就在于組件與子組件內部元素的組織上,在組件里面沒有children元素供我們訪問和展現(暫不考慮render函數),取而代之的API是slot
使用場景定義:
<template> <div id="app"> <self-component> <!--self-component表示自定義的組件--> <span>12345</span> <!--父組件里的嵌套標簽--> </self-component> </div> </template> <script> export default { components: [selfComponent] } </script> <!--self-component的組件模板--> <template> <div> <button><slot></slot></button> </div> </template> <script> export default { // 只有子組件的模板里面有slot標簽,才能取到寫在自定義組件里面的標簽的渲染引用 } </script>
slot特性的進階兩點:
slot插入內容的編譯作用域:被分發的內容的作用域,根據其所在模板決定
<!-- 父組件模板 --> <child :items="items"> <!-- 作用域插槽也可以是具名的 --> <li slot="item" slot-scope="props" class="my-fancy-item">{{ props.text }}</li> </child> <!-- 子組件模板 --> <ul> <slot name="item" v-for="item in items" :text="item.text"> <!-- 這里寫當父組件引用子組件但沒寫內部內容時展示的東東 --> </slot> </ul>
slot的name屬性來指定標簽插入的位置,也就是文檔里面的具名插槽(這個官方文檔說的明白)
動態組件
動態組件這個特性,很多人寫的Vue項目也不少,但也沒用到過這個,有必要多說幾句
動態組件適用情況:
使用的方法(借鑒文檔):
<keep-alive> <component v-bind:is="currentView"> <!-- 組件在 vm.currentview (對應組件名稱)變化時改變! --> <!-- 非活動組件將被緩存!可以保留它的狀態或避免重新渲染 --> </component> </keep-alive>
注意點:
ps:<keep-alive>不會在函數式組件中正常工作,因為它們沒有緩存實例。
動畫與過渡
其實很多前端工程師第一次用Vue的動畫和過渡都是通過庫組件來做到的,所以對這塊沒怎么深挖,各種過渡特效和按鈕動畫就跑起來了,現在就看下文檔,補補課
前端實現動畫的基本方法分為三種種:css3的過渡和keyframe/javascript操縱dom/使用webgl或者canvas來獨立實現,其中第三種是作為展示動畫,與交互結合較少,而Vue作為一個框架,其支持動畫基是從前兩種入手的,從官方文檔提到的四種支持就可以看出這一點。不過官方文檔是從DOM過渡和狀態過渡兩個方面來講解,前者是DOM的消失和出現的動畫等屬性的變化,后者是頁面上某些值的變化。
DOM屬性的改變
若是單個元素/組件的顯隱,在組件外面包裹一層<transition></transition>,而后選擇是css過渡還是javascript過渡
CSS過渡:
<!-- 每種CSS動畫庫對應的class命名規則可能不同,所以根據不同庫要自己寫,以animate.css為例 --> <transition name="custom-classes-transition" enter-active-class="animated tada" leave-active-class="animated bounceOutRight" :duration="{ enter: 500, leave: 800 }" >...</transition> <!-- duration屬性可以傳一個對象,定制進入和移出的持續時間-->
JS過渡:
<template> <transition v-bind:css="false" v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:leave="leave" v-on:leave-cancelled="leaveCancelled"> <!-- 對于僅使用 JavaScript 過渡的元素添加 v-bind:css="false",Vue 會跳過 CSS 的檢測 --> </transition> </template> <script> methods: { // 以Velocity庫為例 beforeEnter: function (el) {/*...*/}, // 此回調函數是可選項的設置 enter: function (el, done) { // Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 }) done() //回調函數 done 是必須的。否則,它們會被同步調用。 }, leave: function (el, done) { // Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 }) done() }, leaveCancelled: function (el) {/*...*/} } </script>
多元素過渡其實就是一句話:照常使用v-if/v-else的同時對同一種標簽加上key來標識
Vue對于這種多元素動畫有隊列上的處理,這就是transiton這個標簽上的mode屬性,通過指定(in-out|out-in)模式,實現消失和出現動畫的隊列效果,讓動畫更加自然。
<transition name="fade" mode="out-in"> <!-- ... the buttons ... --> </transition>
多組件過渡也是一句話:用上一節提到的動態組件,即可完成。
針對列表過渡,其本質仍是多個元素的同時過渡,不過列表大部分是通過數組動態渲染的,因此有獨特的地方,不過整體的動畫思路不變。具體有以下幾點
<template> <button v-on:click="shuffle">Shuffle</button> <transition-group name="flip-list" tag="ul"> <li v-for="item in items" v-bind:key="item">{{ item }}</li> </transition-group> </template> <script> import _ from 'lodash'; export default { data() { return { items: [1,2,3,4,5,6,7,8,9] } }, methods: { shuffle: function () { this.items = _.shuffle(this.items) } } } </script> <style lang="css"> .flip-list-move { transition: transform 1s; } </style>
數值和屬性動態變化
這一部分的動畫主要是針對數據元素本身的特效,比如數字的增減,顏色的過渡過程控制,svg動畫的實現等,其本質都是數字/文本的變化。 我自己總結就是:通過利用Vue的響應式系統,把數字的變化通過外部庫把DOM上對應數值的變化做出連續的效果,如1->100是個數字遞增的連續過程,黑色->紅色的過程。官方文檔主要是用幾個示例代碼來說明,其本質步驟如下:
上面這個思路走一遍下來就完成了一個單元級別的動畫效果,這種類似的流程其實是很常見的需求,所以有必要把這個過程封裝成一個組件,只暴露要過渡的值作為入口,每次改變這個值都是一個動畫過渡效果。組件封裝需要在上面四個步驟的基礎上添加mounted生命周期規定初始值即可,同時原來的兩個值a/b在組件里面作為一個值,可以用watch對象中的newValue和oldValue作為區分。 至于最后的SVG,其本質也是數字的過渡,只不過里面涉及的狀態變量更多,代碼更長而已,不過純前端頁面這種需求倒還是不多的,不過作為愛好倒可以鼓搗一些好玩的小demo,不過肯定需要設計師的參與,要不那些參數可不好調出來吶。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。