Vue多元素过渡
前面的话
前面分别介绍了单元素过渡的CSS过渡和JS过渡,本文将详细介绍Vue多元素过渡
常见示例
最常见的多标签过渡是一个列表和描述这个列表为空消息的元素:
<transition>
<table v-if="items.length > 0">
<!-- ... -->
</table>
<p v-else>Sorry, no items found.</p>
</transition>
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="clear">清空数据</button>
<button @click="reset">重置</button>
<transition name="fade">
<ul v-if="items.length > 0">
<li v-for="item in items">{{item}}</li>
</ul>
<p v-else>Sorry, no items found.</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
items: ['html','css','js']
},
methods:{
clear(){
this.items.splice(0);
},
reset(){
history.go();
}
}
})
</script>
同标签名称
如果是相同标签名的元素切换时,Vue 为了效率只会替换相同标签内部的内容
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="show = !show">toggle</button>
<transition name="fade">
<p v-if="show">我是小火柴</p>
<p v-else>我不是小火柴</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
show:true
},
})
</script>
由下面的示例可知,两个相同的p元素切换时,无过渡效果
  因此,对于具有相同标签名的元素切换的情况,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们 
<div id="demo">
<button @click="show = !show">toggle</button>
<transition name="fade">
<p v-if="show" key="trueMatch">我是小火柴</p>
<p v-else key="falseMatch">我不是小火柴</p>
</transition>
</div>
替代if
  在一些场景中,可以给通过给同一个元素的 key 特性设置不同的状态来代替 v-if 和 v-else
<transition>
<button v-if="isEditing" key="save">Save</button>
<button v-else key="edit">Edit</button>
</transition>
上面的例子可以重写为
<transition>
<button v-bind:key="isEditing">
{{ isEditing ? 'Save' : 'Edit' }}
</button>
</transition>
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="isEditing = !isEditing">toggle</button>
<transition name="fade">
<p v-bind:key="isEditing">
{{ isEditing ? 'Save' : 'Edit' }}
</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isEditing:true
},
})
</script>
  使用多个 v-if 的多个元素的过渡可以重写为绑定了动态属性的单个元素过渡
<transition>
<button v-if="docState === 'saved'" key="saved">Edit</button>
<button v-if="docState === 'edited'" key="edited">Save</button>
<button v-if="docState === 'editing'" key="editing">Cancel</button>
</transition>
可以重写为
<transition>
<button v-bind:key="docState">{{ buttonMessage }}</button>
</transition>
computed: {
  buttonMessage: function () {
    switch (this.docState) {
      case 'saved': return 'Edit'
      case 'edited': return 'Save'
      case 'editing': return 'Cancel'
    }
  }
}
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="change">change</button>
<transition name="fade">
<p v-bind:key="docState">{{ message }}</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
index:0,
isEditing:true,
arr:['saved','edited','editing']
},
computed: {
docState(){
return this.arr[this.index];
},
message() {
switch (this.docState) {
case 'saved': return 'Edit'
case 'edited': return 'Save'
case 'editing': return 'Cancel'
}
}
},
methods:{
change(){
this.index = (++this.index)%3;
}
}
})
</script>
过渡模式
先看下面这个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<transition name="fade">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
  在 “on” 按钮和 “off” 按钮的过渡中,两个按钮都被重绘了,一个离开过渡的时候另一个开始进入过渡。这是 <transition> 的默认行为 - 进入和离开同时发生
同时生效的进入和离开的过渡不能满足所有要求,所以 Vue 提供了过渡模式
in-out: 新元素先进行过渡,完成之后当前元素过渡离开。
out-in: 当前元素先进行过渡,完成之后新元素过渡进入。
【in-out】
下面使用in-out来重写之前的开关按钮过渡
<div id="demo">
<transition name="fade" mode="in-out">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
【out-in】
下面使用out-in来重写之前的开关按钮过渡
<div id="demo">
<transition name="fade" mode="out-in">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
滑动过渡
当元素设置为绝对定位,并互相覆盖,实现透明度过渡效果
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
<div id="demo">
<transition name="fade" >
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
下面是一个使用absolute和translate实现的类似滑动
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter{transform:translateX(30px);}
.fade-leave-to{transform:translateX(-30px);}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
如果设置in-out模式,将实现更酷的滑动效果
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter{transform:translateX(30px);}
.fade-leave-to{transform:translateX(-30px);}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
<div id="demo">
<transition name="fade" mode="in-out">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
多组件过渡
  多个组件的过渡简单很多,不需要使用 key 特性。相反,只需要使用动态组件
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition: .5s;}
</style>
<div id="example">
<button @click="change">切换页面</button>
<transition name="fade" mode="out-in">
<component :is="currentView"></component>
</transition>
</div>
<script>
new Vue({
el: '#example',
data:{
index:0,
arr:[
{template:`<div>ComponentA</div>`},
{template:`<div>ComponentB</div>`},
{template:`<div>ComponentC</div>`}
],
},
computed:{
currentView(){
return this.arr[this.index];
}
},
methods:{
change(){
this.index = (++this.index)%3;
}
}
})
</script>
Vue多元素过渡的更多相关文章
- vue  单元素过渡
		demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ... 
- 066_末晨曦Vue技术_过渡 & 动画之多个元素的过渡
		多个元素的过渡 点击打开视频讲解更加详细 我们之后讨论多个组件的过渡,对于原生标签可以使用 v-if/v-else.最常见的多标签过渡是一个列表和描述这个列表为空消息的元素: <transiti ... 
- vue总结 04过渡--进入/离开 列表过渡
		进入/离开 & 列表过渡 概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CS ... 
- Vue API 4 (过渡和动画)
		transition name 用于自动生成 CSS 过渡类名.例如:name: fade 将自动拓展为 .fade-enter ,.fade-enter-active等.默认类名为 "v& ... 
- Vue可复用过渡和动态过渡
		前面的话 本文将详细介绍Vue可复用过渡和动态过渡 可复用过渡 过渡可以通过 Vue 的组件系统实现复用.要创建一个可复用过渡组件,需要做的就是将 <transition> 或者 < ... 
- vue单元素/组件的过渡
		(1)过渡的类名 v-enter:定义进入过渡的开始状态.在元素被插入之前生效,在元素被插入之后的下一帧移除. v-enter-active:定义进入过渡生效时的状态.在整个进入过渡的阶段中应用,在元 ... 
- Vue入门笔记#过渡
		Vue过渡,可以在元素从DOM中移除,插入时自动调用过渡效果.根据设定,会适时的触发过渡效果. 在使用的目标标签里添加 transition: <div transition="my_ ... 
- vue总结05 过渡--状态过渡
		状态过渡 Vue 的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,比如: 数字和运算 颜色的显示 SVG 节点的位置 元素的大小和其他的属性 所有的原始数字都 ... 
- Vue——关于css过渡和动画那些事
		1. 单元素/组件的过渡transition Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 条件渲染 (使用 v-if) 条件展示 (使用 v ... 
随机推荐
- JSP基本语法总结【2】九大内置对象
			内置对象也称为内建对象,隐含对象,即无需声明,直接可以在JSP中使用的java对象.JSP的内置对象就是把最常用.重要的几个对象直接创建了. JSP有9大内置对象:Request,Response, ... 
- vim中常用基本命令
			一般模式可用命令,含光标移动.复制粘贴.查找替换等功能 Ctrl+f:屏幕向下移动一页,相当Page Down按钮 Ctrl+b:屏幕向上移动一页,相当Page Up按钮 0或Home键:移动到行首 ... 
- JavaScript+svg绘制的一个饼状图
			结果: svg参考:https://www.w3.org/TR/SVG/<body onload='document.body.appendChild( pieChart([12,23,34,4 ... 
- java基础07 多线程
			在学习操作系统时,我们会学习进程和线程,那么进程和线程又是什么东西呢? 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程(thread) ... 
- 计算 x y 的最近值
			计算xy的最近值. 代码如下: package Day05; import java.util.Arrays; public class FindNearestPoints { public stat ... 
- Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移
			Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移 很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitma ... 
- 单元测试报connection is allready closed导致dailybuild中断的解决方案——类加载机制的应用
			现象; 前段时间在dailybuild过程中,经常遇到connection is allready closed错误,特别是在dailybuild高峰期. 分析定位: 这个错误是的起因比较多,这里的情 ... 
- Spring Data JPA在Spring Boot中的应用
			1.JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简 ... 
- 阿里云有对手了!CDN横评:腾讯云优势明显
			如今,云计算产品越来越多,像国内的BAT三大巨头都提供了云主机(腾讯云CVM.阿里云ECS.百度云BCC),另外还有存储.数据库.安全等相关云服务.在这其中,CDN也是一项重要的云服务,CDN指的是内 ... 
- Android学习笔记-EditText(输入框)(二)
			6.控制EditText四周的间隔距离与内部文字与边框间的距离 我们使用margin相关属性增加组件相对其他控件的距离,比如android:marginTop = "5dp" 使用 ... 
