关于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 相关文章推荐
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
js中更短的 Array 类型转换
Oct 30 Javascript
js判断浏览器类型为ie6时不执行
Jun 15 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
Dec 23 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
Mar 08 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
vue - vue.config.js中devServer配置方式
Oct 30 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
js+canvas绘制图形验证码
Sep 21 Javascript
Javascript实现打鼓效果
Jan 29 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
搜索引擎技术核心揭密
2006/10/09 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php开发文档 会员收费1期
2012/08/14 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
php表单处理操作
2017/11/16 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
简述vue中的config配置
2018/01/23 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
python计算文本文件行数的方法
2015/07/06 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Django权限机制实现代码详解
2018/02/05 Python
python将回车作为输入内容的实例
2018/06/23 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
pycharm永久激活超详细教程
2020/10/29 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
高三地理教学反思
2014/01/11 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
Django框架中表单的用法
2022/06/10 Python