关于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 相关文章推荐
Javascript结合css实现网页换肤功能
Nov 02 Javascript
XHTML下,JS浮动代码失效的问题
Nov 12 Javascript
js文本框输入点回车触发确定兼容IE、FF等
Nov 19 Javascript
js对图片base64编码字符串进行解码并输出图像示例
Mar 17 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
使用 vue.js 构建大型单页应用
Feb 10 Javascript
js中的数组对象排序分析
Dec 11 Javascript
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
原生JS实现天气预报
Jun 16 Javascript
JavaScript数组reduce()方法的语法与实例解析
Jul 07 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
一周学会PHP(视频)Http下载
2006/12/12 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
javascript实现playfair和hill密码算法
2014/12/07 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
详解JavaScript中操作符和表达式
2018/09/12 Javascript
微信小程序开发的基本流程步骤
2019/01/31 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python实现目录树生成示例
2014/03/28 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
德国网上超市:myTime.de
2019/08/26 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
优秀教师先进材料
2014/12/16 职场文书
优秀党员先进材料
2014/12/18 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书