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 相关文章推荐
Javascript的构造函数和constructor属性
Jan 09 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Aug 12 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
Jan 06 Javascript
node.js使用nodemailer发送邮件实例
Mar 10 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
JS作用域深度解析
Dec 29 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
JavaScript ES2019中的8个新特性详解
Feb 20 Javascript
基于 jQuery 实现键盘事件监听控件
Apr 04 jQuery
JavaScript使用ul中li标签实现删除效果
Apr 15 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 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
php利用cookie实现访问次数统计代码
2011/05/19 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
理解AngularJs指令
2015/12/10 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
python将数据插入数据库的代码分享
2020/08/16 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
学习自我鉴定
2014/02/01 职场文书
王老吉广告词
2014/03/20 职场文书
美容院经理岗位职责
2014/04/03 职场文书
爱情寄语大全
2014/04/09 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS