Vue中多个元素、组件的过渡及列表过渡的方法示例


Posted in Javascript onFebruary 13, 2019

多个元素之间过渡动画效果

多元素之间如何实现过渡动画效果呢?看下面代码

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

<div id="root">
  <transition name="fade">
    <div v-if="show">hello world</div>
    <div v-else>bye world</div>
  </transition>
  <button @click="handleClick">切换</button>
</div>

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

这么写行不行呢?肯定是不行的,因为 Vue 在两个元素进行切换的时候,会尽量复用dom,就是因为这个原因,导致现在动画效果不会出现。

如果不让 Vue 复用dom的话,应该怎么做呢?只需要给这两个div不同的key值就行了

<div v-if="show" key="hello">hello world</div>
<div v-else key="bye">bye world</div>

这个时候当div元素进行切换的时候,就不会复用了。

mode

Vue 提供了一mode属性,来实现多个元素切换时的效果

mode取值in-out,动画效果是先出现在隐藏

<div id="root">
  <transition name="fade" mode="in-out">  //第一次点击时,执行顺序为:①②
    <div v-if="show">hello world</div> //再消失 ②
    <div v-else>bye world</div>    //先显示 ①
  </transition>
  <button @click="handleClick">切换</button>  
</div>

mode取值为out-in,动画效果为先隐藏在出现

<div id="root">
  <transition name="fade" mode="out-in">  //第一次点击时,执行顺序为:①②
    <div v-if="show">hello world</div> //先消失 ①
    <div v-else>bye world</div>    //再显示 ②
  </transition>
  <button @click="handleClick">切换</button>  
</div>

多个组件之间过渡动画效果

这里需要借助动态组件来实现多组件之间过渡动画效果

先用普通的方式来实现切换:

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

<div id="root">
  <transition name="fade" mode="in-out">
    <child-one v-if="show"></child-one>
    <child-two v-else></child-two>
  </transition>
  <button @click="handleClick">切换</button>
</div>

Vue.component('child-one',{
  template:'<div>child-one</div>'
})
Vue.component('child-two',{
  template:'<div>child-two</div>'
})
let vm = new Vue({
  el: '#root',
  data: {
    show: true
  },
  methods: {
    handleClick() {
      this.show = !this.show
    }
  }
})

你会发现,这样子实现组件切换,transition动画效果是存在的,但是我们想要用动态组件来实现,该怎么弄呢?

可查看之前的文章:Vue 动态组件与 v-once 指令,这篇文章中详细的介绍了 Vue 的动态组件

列表过渡

这里需要使用一个新标签transition-group来是实现

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

<div id="root">
  <transition-group name="fade">
    <div v-for="item of list" :key="item.id">{{item.title}}-----{{item.id}}</div>
  </transition-group>
  <button @click="handleClick">添加</button>
</div>

let vm = new Vue({
  el: '#root',
  data: {
    count:0,
    list:[]
  },
  methods: {
    handleClick() {
      this.list.push({
        id:this.count ++,
        title:'hello world'
      })
    }
  }
})

为什么使用了transition-group标签后,就可以出现过渡动画效果了呢?看下面代码:

<transition-group name="fade">
  <div>hello world</div>
  <div>hello world</div>
  <div>hello world</div>
</transition-group>

在循环过后,页面中会出现一个个div元素,如果你在外面添加一个transition-group的标签,相当于你在每一个div外层都加了一个transition标签,看下面代码

<transition>
  <div>hello world</div>
</transition>
<transition>
  <div>hello world</div>
</transition>
<transition>
  <div>hello world</div>
</transition>

这时候,Vue 把列表的过渡转化为单个的div元素的过渡了,Vue 会在这个元素隐藏或者显示的时候动态的找到时间点,增加对应的class。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
js form action动态修改方法
Nov 04 Javascript
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
JS操作JSON要领详细总结
Aug 25 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
使用console进行性能测试
Apr 27 Javascript
jQuery获取父元素及父节点的方法小结
Apr 14 Javascript
使用AJAX实现Web页面进度条的实例分享
May 06 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
Oct 14 Javascript
详解原生js实现offset方法
Jun 15 Javascript
Vue 中mixin 的用法详解
Apr 23 Javascript
基于vue实现探探滑动组件功能
May 29 Javascript
vue写h5页面的方法总结
Feb 12 #Javascript
如何将百度地图包装成Vue的组件的方法步骤
Feb 12 #Javascript
微信小程序websocket聊天室的实现示例代码
Feb 12 #Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 #Javascript
图文详解vue框架安装步骤
Feb 12 #Javascript
详解vue组件中使用路由方法
Feb 12 #Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 #Javascript
You might like
德生PL550的电路分析
2021/03/02 无线电
支持oicq头像的留言簿(二)
2006/10/09 PHP
PHP实现多条件查询实例代码
2010/07/17 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
php调用C代码的实现方法
2014/03/11 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python 正则式使用心得
2009/05/07 Python
python使用cookielib库示例分享
2014/03/03 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
python 统计代码行数简单实例
2017/05/04 Python
python3大文件解压和基本操作
2017/12/15 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
文明餐桌活动方案
2014/02/11 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
中学生励志演讲稿
2014/04/26 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
作文评语集锦
2014/12/25 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python