关于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处理table表格的代码
Dec 06 Javascript
jQuery对表单的操作代码集合
Apr 06 Javascript
JQuery 常用方法和事件详细介绍
Apr 18 Javascript
javascript自定义右键弹出菜单实现方法
May 25 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
js实现延迟加载的方法
Jun 24 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
Nov 25 Javascript
vue2.0+webpack环境的构造过程
Nov 08 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
vue 实现购物车总价计算
Nov 06 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 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
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
Ext grid 添加右击菜单
2009/11/26 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
浅谈Python type的使用
2019/11/19 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
心理健康教育心得体会
2013/12/29 职场文书
2014年三万活动总结
2014/04/26 职场文书
优秀求职信
2014/05/29 职场文书
经济贸易系求职信
2014/08/04 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
小班上学期个人总结
2015/02/12 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
Python3接口性能测试实例代码
2021/06/20 Python
Javascript 解构赋值详情
2021/11/17 Javascript