关于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 相关文章推荐
通过DOM脚本去设置样式信息
Sep 19 Javascript
某人初学javascript的时候写的学习笔记
Dec 30 Javascript
chrome原生方法之数组
Nov 30 Javascript
JavaScript中常用的运算符小结
Jan 18 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
Oct 17 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
用jQuery的AJax实现异步访问、异步加载
Nov 02 Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
Oct 27 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
PHP 日,周,月点击排行统计
2012/01/11 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php猜单词游戏
2015/09/29 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
重置Redux的状态数据的方法实现
2019/11/18 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
带你认识Django
2019/01/15 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
工作汇报开头与结尾怎么写
2014/11/08 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书