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 相关文章推荐
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
一个简单的弹性返回顶部JS代码实现介绍
Jun 09 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
Oct 31 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
Feb 28 Javascript
vue页面切换到滚动页面显示顶部的实例
Mar 13 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
Jan 30 Javascript
JS实现星星海特效
Dec 24 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
Aug 06 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
一个简单计数器的源代码
2006/10/09 PHP
php横向重复区域显示二法
2008/09/25 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
分享3个php获取日历的函数
2015/09/25 PHP
php 数组元素快速去重
2017/05/05 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
js location.replace与location.reload的区别
2010/09/08 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
js转html实体的方法
2016/09/27 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
jQuery冲突问题解决方法
2021/01/19 jQuery
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python 如何调用远程接口
2020/09/11 Python
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
车辆安全检查制度
2014/01/12 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
学校四群教育实施方案
2014/06/12 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
css3带你实现3D转换效果
2022/02/24 HTML / CSS
python高温预警数据获取实例
2022/07/23 Python