关于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 while语句和do while语句的区别分析
Dec 08 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
Dec 17 Javascript
js倒计时小程序
Nov 05 Javascript
JS获取当前日期和时间的简单实例
Nov 19 Javascript
浅谈javascript实现八大排序
Apr 27 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
vue 自定义 select内置组件
Apr 10 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
KOA+egg.js集成kafka消息队列的示例
Nov 09 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
koa+mongoose实现简单增删改查接口的示例代码
May 13 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如何解决无法上传大于8M的文件问题
2014/03/10 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
vue如何获取点击事件源的方法
2017/08/10 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
python实现数据写入excel表格
2018/03/25 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
应聘文员自荐信范文
2014/03/11 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
民政工作个人总结
2015/02/28 职场文书
java设计模式--原型模式详解
2021/07/21 Java/Android