Vue的动画封装

Posted tengteng0520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue的动画封装相关的知识,希望对你有一定的参考价值。

问题:如果在slot标签上使用v-show,程序功能是无法实现的,必须改成v-if。

原因:slot实际是一个抽象元素,有点类似template,本质并不是一个元素。

而v-show是通过控制元素的display来进行显示和隐藏的,slot本身不是元素,所以压根就不会有display这个css属性

所以,slot显示隐藏,要使用v-if。

css动画在<style>中定义,js动画在@before-enter="handleBeforEnter"中定义

步骤:

1.定义一个名为fade 的组件,然后在加上transition模板,并在此模板中加入slot插槽,slot中v-if绑定“show”属性,它的显示与否取决于父组件fade传进来的show的变量是否是show

2.当使用的时候只需要在dom元素上包裹一层fade组件,并在fade组件上绑定show属性,令其等于子组件中v-if绑定的show内容。

3.推荐动画使用js动画而不是css动画,从而使所有动画代码封装在一个组件里。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue的动画封装</title>
<script src="./vue.js"></script>
</head>
<body>
  <div id="root">
   
    <fade :show="show">
      <div>hello world
      </div>
    </fade>
     <fade :show="show">
      <h1>hello world
      </h1>
    </fade>
    <button @click="handleBtnClick">toggle</button>
   </div>
   <script>
    Vue.component(fade,{
      props:[show],
      template:`
      <transition @befor-enter="handleBeforeEnter"
       @enter="handleEnter">
       <slot v-if="show"></slot>
       </transition>`,
       methods:{
        handleBeforeEnter:function(el){
          el.style.color=red
        },
        handleEnter:function(el,done){
          setTimeout(()=>{
            el.style.color=green
            done()
          },4000)

        }
       }

    })
    
    var vm=new Vue({
      el:#root,
      data:{
      show:false
      },
      methods:{
       handleBtnClick:function(){
        this.show=!this.show
       }
      }
    })
   </script>
</body>
</html>

以上是关于Vue的动画封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

回归 | js实用代码片段的封装与总结(持续更新中...)

Vue封装的过渡与动画

vue封装一个等待加载的动画

vue动画的封装

Vue的动画封装