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的图片大小自动适应实现代码
Nov 17 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
Aug 28 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
Apr 18 Javascript
javascript控制图片播放的实现代码
Jul 29 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
Jun 26 Javascript
javascript构造函数以及原型对象的理解
Jan 13 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
解决vue attr取不到属性值的问题
Sep 18 Javascript
JS多个表单数据提交下的serialize()应用实例分析
Aug 27 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 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学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
深入浅析python定时杀进程
2016/06/06 Python
Python AES加密实例解析
2018/01/18 Python
python模糊图片过滤的方法
2018/12/14 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
python软件都是免费的吗
2020/06/18 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
学院书画协会部门岗位职责
2013/12/01 职场文书
工程质量承诺书范文
2014/03/27 职场文书
禁止酒驾标语
2014/06/25 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
2016公司年会主持词
2015/07/01 职场文书
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers