Vue 動畫的封裝

如何進行動畫封裝,讓動畫變的可複用,看下面代碼動畫

.fade-enter,.fade-leave-to{
    opacity: 0;
}
.fade-enter-active,
.fade-leave-active{
    transition: opacity 1s;
}

<div id="root">
    <transition name="fade">
        <div v-show="show">hello world</div>
    </transition>
    <button @click="handleClick">toggle</button>
</div>

let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick() {
            this.show = !this.show
        }
    }
})

上面代碼是很是簡單的,顯示隱藏效果,在項目中,能夠會用不少地方會用到這種效果,那咱們該如何實現封裝呢?this

.fade-enter,.fade-leave-to{
    opacity: 0;
}
.fade-enter-active,
.fade-leave-active{
    transition: opacity 1s;
}

<div id="root">
    <transition name="fade">
        <div>hello world</div>
    </transition>
    <button @click="handleClick">toggle</button>
</div>

Vue.component('fade',{
    props:['show'],
    template:`<transition name="fade">
                <slot v-if="show"></slot>
             </transition>`
})

let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick() {
            this.show = !this.show
        }
    }
})

使用要封裝的內容寫成組件,並用slot插槽接管組件內容,就能實現動畫封裝了。看下面代碼:code

<div id="root">
    <fade :show="show">
        <h1>hello world</h1>
    </fade>
    <fade :show="show">
        <div>hello world</div>
    </fade>
    <button @click="handleClick">toggle</button>
</div>

若是需求想把樣式也一塊兒封裝該怎麼實現呢?這裏就要用到js動畫了,看下面代碼component

<div id="root">
    <transition name="fade">
        <div>hello world</div>
    </transition>
    <button @click="handleClick">toggle</button>
</div>

Vue.component('fade',{
    props:['show'],
    template:`
        <transition name="fade"
                   @before-enter="handleBeforeEnter"
                   @enter="handleEnter"
                   @afterEnter="handleAfterEnter"
         >
            <slot v-if="show">hello world</slot>
        </transition>`,
    methods: {
        handleBeforeEnter(el){
            el.style.color = 'red'
        },
        handleEnter(el,done){
            setTimeout(()=>{
                el.style.color = 'green'
                done()
            },2000)
        },
        handleAfterEnter(el){
            setTimeout(()=>{
                el.style.color = 'blue'
            },2000)
        }
    }
})

let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick() {
            this.show = !this.show
        }
    }
})

上面代碼用了js提供的鉤子動畫before-enterenterafter-enter,用這種方法寫,全部的動畫都寫在了組件裏,外部只須要調用這個fade組件就能夠了,也不須要全局去寫一些樣式了,這種動畫的封裝是比較推薦的一種動畫封裝,由於它能夠把全部動畫的實現完整的封裝在一個組件中。ci

相關文章
相關標籤/搜索