请教!Vue3内置组件Transition的事件钩子问题

82 阅读1分钟

见代码,(先忽略事件钩子函数),我用css实现了一个动画效果,在不添加 mode="out-in",两句话的进场和出场是同时进行的,因此我添加了mode="out-in",最终效果是:先出场,完毕再进场。 现在我想用事件函数实现相同效果。 问题来了: 1、不能加mode 加了就报错,是通过事件钩子实现动画时不能加还是我写错哪里了? 2、只看到进场效果,实现不了css那种效果,leave里面不调用done倒是可以看到,但是vue不会销毁它。怎么实现相同效果?

<template>
  <div>
    <Transition
      appear
      @before-enter="beforeEnter"
      @enter="enter"
      @before-leave="beforeLeave"
      @leave="leave"
      :css="false"
    >
      <p v-if="show">welcome</p>
      <p v-else>goodbye</p>
    </Transition>
    <button @click="toggle">{{ show ? "再见" : "欢迎" }}</button>
  </div>
</template>
<script lang="ts" setup>
import { ref } from "vue";
const show = ref(true);
const toggle = () => {
  show.value = !show.value;
};
const beforeEnter = (el) => {
  console.log("before enter");
  el.style.opacity = 0;
  el.style.transform = "translateX(100px)";
};

const enter = (el, done) => {
  console.log("enter");
  el.offsetWidth
  el.style.opacity = 1;
  el.style.transform = "translateX(0)";
  el.style.transition = "all 2s ease";

};
const beforeLeave = (el) => {
  console.log("before leave");
  el.style.opacity = 1;
  el.style.transform = "translateX(0)";
};
const leave = (el, done) => {
  el.offsetWidth
  console.log("leave");
  el.style.opacity = 0;
  el.style.transform = "translateX(100px)";
  el.style.transition = "all 2s ease";
      done();
};
</script>
<style>
 @keyframes fade-in {
  from {
    transform: translateX(100px);
  }
  to {
    transform: translateX(0);

  }
}
@keyframes fade-out {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(100px);
  }
}
.v-enter-from,
.v-leave-to {
  opacity: 0;
}
.v-enter-active{
  transition: opacity 2s ease;
  animation: fade-in 2s ease;
}
.v-leave-active {
  transition: opacity 2s ease;
  animation:  fade-out 2s ease;
}
.v-enter-to,
.v-leave-from {
  opacity: 1;
} 
</style>