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 相关文章推荐
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
javascript实现仿IE顶部的可关闭警告条
May 05 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
Aug 25 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
Dec 08 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
Feb 16 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
jQuery实现的分页功能示例
Jan 22 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
vue环形进度条组件实例应用
Oct 10 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
Jun 03 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实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP取进制余数函数代码
2012/01/19 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
js 日期转换成中文格式的函数
2009/07/07 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
jQuery帮助之筛选查找 children([expr])
2011/01/31 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
原生js实现3D轮播图
2020/03/21 Javascript
js仿360开机效果
2019/12/26 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
详解JS预解析原理
2020/06/16 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
python函数的作用域及关键字详解
2019/08/20 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
设计师个人求职信范文
2014/02/02 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
北京导游词
2015/02/12 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书