vue内置组件Transition的详解

一、Transition介绍

Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动画:

  • <Transition>会在一个元素或组件进入和离开 DOM 时应用动画。
  • <TransitionGroup> 会在一个 v-for 列表中的元素或组件被插入,移动,或移除时应用动画。

简单地说,就是当元素发生变化,比如消失、显示时,添加动画让它更自然过渡。它是vue内置组件,不需要引入注册就可以直接使用。

二、在什么情况会出现过渡?

  • v-if切换
  • v-show切换
  • 动态组件component切换
  • 改变特殊的key属性

前几个比较好理解,最后一个用到了key值变化导致元素强制更新。下面例子的key值变化,vue会认为这里产生了一个新元素,之前的会被删除,从而导致过渡。

<script setup>
import { ref } from 'vue'
  
const keyValue = ref(1)
</script>

<template>
  <button @click="() =>keyValue = Math.random()">Toggle</button>
  <Transition >
    <p :key="keyValue">hello</p>
  </Transition>
</template>

<style>
.v-enter-active,
.v-leave-active {
  transition: opacity 0.5s ease;
}

.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

三、默认过渡类名

如果不给命名的话,添加动画效果的默认类名前缀是v-

在这里插入图片描述

transition提供六个钩子函数,提供给我们在不同时机编写相应的动画效果。以下是此六个钩子函数执行时机

  • v-enter:进入过渡开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:进入过渡生效时的状态。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
  • v-enter-to:进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
  • v-leave: 离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除
  • v-leave-active:离开过渡生效时的状态。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
  • v-leave-to:离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除

四、自定义过渡类名

通过name可以自定义<Transition>的过渡类名。

<Transition name="a">
  ...
</Transition>
.a-enter-active,
.a-leave-active {
  transition: opacity 0.5s ease;
}

.a-enter-from,
.a-leave-to {
  opacity: 0;
}

注意:里面只能有一个根组件,但使用v-if、v-else、v-else-if切换显示是可以的。
如果想对列表中的元素设置过渡,可以使用

五、过渡模式

可以设置属性modeout-inin-out
in-out表示当前元素先进行过渡,完成之后新元素过渡进入。
通常我们更多的会使用out-in,让当前元素先离开,然后再进行新元素的进入 。

<transition mode="out-in">
</transition>

六、过渡时间

duration属性设置过渡持续的时间,单位是毫秒。

<Transition :duration="550">...</Transition>

七、深层元素的过渡

可以给深层级的元素设置过渡效果。

<Transition name="fade">
  <div v-if="show" class="outer">
    <div class="inner">
      Hello
    </div>
  </div>
</Transition>
/* 应用于嵌套元素的规则 */
.fade-enter-active .inner,
.fade-leave-active .inner {
  transition: all 0.3s ease-in-out;
}

.fade-enter-from .inner,
.fade-leave-to .inner {
  transform: translateX(30px);
  opacity: 0;
}

八、过渡的钩子函数

js写法很少用,不如css写法,js和css还可以结合使用,当然如果你不想结合使用,设置一下:css=“false” 即可

<template>
  <div>
    <transition
      :css="false" 
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter"
      @enter-cancelled="enterCancelled"
      @before-leave="beforeLeave"
      @leave="leave"
      @after-leave="afterLeave"
      @leave-cancelled="leaveCancelled"
    >
      <p v-if="show">hello</p>
    </transition>
     <button @click="show = !show">切换</button>
  </div>
</template>

<script>
export default {
  name: 'ItemTwo',
  data() {
    return {show:false}
  },
  methods: {
    // 进入
    beforeEnter(el){
      //el就是标签对象,可对标签对象进行操作
    },
    // 当与 CSS 结合使用时
    // 回调函数 done 是可选的
    enter(el, done){
      el.style.color="green"
    //done()代表着完成,不执行这个done函数,那么它就不会执行下一个afterEnter钩子函数
    },
    afterEnter(el) {
    },
    //取消过渡执行这个钩子
    enterCancelled(el){
    },
    // 离开钩子函数就不详细写了
    beforeLeave(){},
    leave(){},
    afterLeave(){},
    leaveCancelled(){}
    },
}
</script>

九、封装过渡效果

<!-- MyTransition.vue -->
<script>
// JavaScript 钩子逻辑...
</script>

<template>
  <!-- 包装内置的 Transition 组件 -->
  <Transition
    name="my-transition"
    @enter="onEnter"
    @leave="onLeave">
    <slot></slot> <!-- 向内传递插槽内容 -->
  </Transition>
</template>

<style>
</style>

注意: 该组件样式不要添加scoped , 不然插槽内没有过渡效果。

<MyTransition>
  <div v-if="show">Hello</div>
</MyTransition>

十、transition-group使用

对列表进行过渡渲染时,就必须使用transition-group元素包裹。点击列表中内容,按照以下动画移除,示例如下

<template>
  <div class="main_css">
    <transition-group name="slide">
      <li v-for="(item,i) in list" :key="item.id" @click="del(i)">
        {{ item.id }} --- {{ item.name }}
      </li>
    </transition-group>
  </div>
</template>
<script>
export default {
  name: 'transitionGroupTest',
  data () {
    return {
      list: [{
        id: 1,
        name: '红烧鱼'
      },
      {
        id: 2,
        name: '炒土豆'
      },
      {
        id: 3,
        name: '烧茄子'
      }
      ]
    }
  },
  methods: {
    del (i) {
      this.list.splice(i, 1)
    }
  }
}
</script>
<style scoped>
  .main_css {
    margin-left: 50px;
    margin-top: 50px;
  }
  .slide-enter-active {
    transition: all .5s linear;
  }
  .slide-leave-active {
    transition: all .1s linear;
  }
  .slide-enter {
    transform: translateX(-100%);
    opacity: 0;
  }
  .slide-leave-to {
    transform: translateX(110%);
    opacity: 0;
  }
</style>

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 提供了多种组件通信的方法,包括 Props、事件、Provide/Inject、$attrs/$listeners、Ref、Custom Events 等。下面我会逐一详细介绍这些方法。 1. Props:通过向子组件传递属性值来实现父子组件之间的通信。父组件可以通过 props 属性将数据传递给子组件,并在子组件中使用。子组件通过 props 接收父组件传递的数据,并进行相应的处理。 2. 事件:父组件可以通过自定义事件的方式向子组件传递数据。子组件通过 $emit 方法触发事件,并将数据作为参数传递给父组件。父组件通过在子组件上监听自定义事件,并在事件处理函数中接收子组件传递的数据。 3. Provide/Inject:父组件可以通过 provide 方法提供数据,然后在子组件中通过 inject 方法注入数据。这种方式可以实现跨层级的组件通信,但是不推荐在大型项目中过度使用。 4. $attrs/$listeners:$attrs 用于获取父组件传递给子组件的非 prop 属性,$listeners 用于获取父组件传递给子组件的事件。这两个属性可以使得子组件可以接收父组件的所有属性和事件,从而简化了父子组件之间的通信。 5. Ref:Ref 是一个特殊的对象,可以被用于在组件之间共享可变的状态。通过 ref 函数创建一个 ref 对象,并将其传递给子组件。子组件可以通过 .value 来访问和修改 ref 对象的值。 6. Custom Events:在 Vue 3 中,自定义事件可以通过创建一个新的事件实例,并使用 $on 和 $emit 方法进行监听和触发。这种方法可以实现更灵活的组件通信方式。 以上就是一些 Vue 3 中常用的组件通信方法。根据具体的场景和需求,选择合适的方法来实现组件之间的通信。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值