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 ...
随机推荐
- sublime text 3 配置python IDE
Python越来越受“程序猿”们的青睐.快速的开发模式,简洁的代码格式,海量的扩展,这无疑都为python的火热奠定了基础. “磨刀不误砍柴工”,一款功能强劲的IDE能帮助开发者有效的管理.编辑,运行 ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- Oracle数据迁移-系统数据合并笔记
创建临时表:execute immediate 'sql'; 通过临时表和关联查询解决循环处理效率低下,大数据操作移植时时间太长的问题. 结构相同的系统数据库表移植,案例如下: create or r ...
- C语言学习随笔
前段时间我们学习了HTML,感觉自己不在状态,后来就开始怀疑自己的智商呢!现在C语言也到了尾声,在这20天的学习过程中,我没 有以前那么的傲娇了. 我开始慢慢去反省自己,自己究竟该如何去学习,都说勤能 ...
- CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划)
CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划) Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的 ...
- ActiveMQ结合WebScoket应用例子以及介绍
一.ActiveMQ的介绍? 1.JMS基础概念 JMS(java Message Service) 即使java消息服务,它提供标准的产生.发送.接收的接口简化企业应用开发,它支持两种消息通信模型: ...
- MySQL IO线程及相关参数调优
一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分 ...
- POJ 2566 尺取法(进阶题)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4297 Accepted: 1351 Spe ...
- [bzoj 1468][poj 1741]Tree [点分治]
Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...
- Python判断文件是否存在的三种方法
通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件或文件夹是否存在的方法,分别使用os模块.Try ...