关于vue状态过渡transition不起作用的原因解决


Posted in Javascript onApril 09, 2019

总所周知,vue中的transition标签可以方便得进行动画过渡,使用的方法也很简单。

<transition name="你要的名字">
  过渡的元素...
</transition>

这里需要主要一点的是:过渡的元素只能是以下之一:

条件渲染 (使用 v-if)
条件展示 (使用 v-show)
动态组件
组件根节点

常用的过渡名称有fade等

你可以这样用

<transition name="fade">
  过渡的元素...
</transition>

实现的效果就是淡入淡出。

如果需要自定义过渡动画的,记得在css中修改以下的类名:

你要的名字-enter             进入前效果
你要的名字-enter-active     进入的过渡时间和函数
你要的名字-enter-to         进入后效果
你要的名字-leave             离开前效果
你要的名字-leave-active     离开的过渡时间和函数
你要的名字-leave-to         离开后效果

写到这里相信大家都已经会简单地使用transition了。

请阅读以下的代码:

<transition name="fade">
   <div v-if="show">
     <div class="item-box"></div>
   </div>
   <div v-else>
     <span>暂无更多</span>
   </div>
</transition>

结果是完全没有淡入淡出的效果,那这是什么原因导致transition不起作用呢?

原因在这里:

当有相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们,否则 Vue为了效率只会替换相同标签内部的内容。即使在技术上没有必要,给在 <transition> 组件中的多个元素设置 key 是一个更好的实践。

所以需要这样写:

<transition name="fade">
   <div v-if="show" key="box1">
     <div class="item-box"></div>
   </div>
   <div v-else key="box2">
     <span>暂无更多</span>
   </div>
</transition>

刷新运行,完美实现效果~~~~

参考资料:https://cn.vuejs.org/v2/guide/transitions.html

补充:

问题1:不同类型的组件之间切换,有过渡效果,而相同组件(不同内容)切换则没有过渡效果

vue官网的描述:当有相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们,否则 Vue 为了效率只会替换相同标签内部的内容。即使在技术上没有必要,给在 组件中的多个元素设置 key 是一个更好的实践。

改进后代码

<transition :name="slide">
 <keep-alive>
  <component 
   :is="questionMap[currentQuestion.type]"
   :key="index"
   :currentQuestion="currentQuestion"
   :index="index">
  </component>
 </keep-alive>
</transition>

给组件添加了key=”index”了之后,不管任何类型都有过渡效果了,因为此时vue将每一个组件区分为不同的组件

问题2:前一个组件滑动出去后,后一个组件没有滑动效果,而是直接显示了

过渡模式有一个问题:一个离开过渡的时候另一个开始进入过渡。这是 的默认行为 - 进入和离开同时发生,因为这样也导致了两个卡片的过渡不太复合需求,我们需要的是一个先离开后另一个再进入。

同时生效的进入和离开的过渡不能满足所有要求,所以 Vue 提供了 过渡模式

  • in-out:新元素先进行过渡,完成之后当前元素过渡离开。
  • out-in:当前元素先进行过渡,完成之后新元素过渡进入。

因此我们需要在transition标签中添加mode来达成效果:

<transition :name="slide" mode="out-in">
 <keep-alive>
  <component 
   :is="questionMap[currentQuestion.type]"
   :key="index"
   :currentQuestion="currentQuestion"
   :index="index">
  </component>
 </keep-alive>
</transition>

如果要使用列表排序的话,需要使用transition-group,下面是一个简单的例子

<div id="list-demo" class="demo">
 <button v-on:click="add">Add</button>
 <button v-on:click="remove">Remove</button>
 <transition-group name="list" tag="p">
  <span v-for="item in items" v-bind:key="item" class="list-item">
   {{ item }}
  </span>
 </transition-group>
</div>
new Vue({
 el: '#list-demo',
 data: {
  items: [1,2,3,4,5,6,7,8,9],
  nextNum: 10
 },
 methods: {
  randomIndex: function () {
   return Math.floor(Math.random() * this.items.length)
  },
  add: function () {
   this.items.splice(this.randomIndex(), 0, this.nextNum++)
  },
  remove: function () {
   this.items.splice(this.randomIndex(), 1)
  },
 }
})
.list-item {
 display: inline-block;
 margin-right: 10px;
}
.list-enter-active, .list-leave-active {
 transition: all 1s;
}
.list-enter, .list-leave-to
/* .list-leave-active for below version 2.1.8 */ {
 opacity: 0;
 transform: translateY(30px);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS中toFixed()方法引起的问题如何解决
Nov 20 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
Jquery选择器中使用变量实现动态选择例子
Jul 25 Javascript
使用jquery解析XML示例代码
Sep 05 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
用js实现简单算法的实例代码
Sep 24 Javascript
js实现表格筛选功能
Jan 18 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
vue.js实现格式化时间并每秒更新显示功能示例
Jul 07 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
Jul 26 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 #Javascript
Angular脚手架开发的实现步骤
Apr 09 #Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 #Javascript
javascript实现手动点赞效果
Apr 09 #Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
Apr 09 #Javascript
浅谈Vue.js组件(二)
Apr 09 #Javascript
4 种滚动吸顶实现方式的比较
Apr 09 #Javascript
You might like
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
MySQL最常见的操作语句小结
2015/05/07 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
python读取LMDB中图像的方法
2018/07/02 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
Pycharm无法显示动态图片的解决方法
2018/10/28 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python 使用元类type创建类对象常见应用详解
2019/10/17 Python
Python中包的用法及安装
2020/02/11 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
元宵节晚会主持人串词
2014/03/25 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
综合素质自我评价评语
2015/03/06 职场文书
导游带团欢迎词
2015/09/30 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL