Vue学习笔记进阶篇之多元素及多组件过渡


Posted in Javascript onJuly 19, 2017

本文介绍了vue 多元素及多组件过渡,这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。

多元素的过渡

对于原生标签可以使用 v-if/v-else.但是有一点需要注意:

当有相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们,否则 Vue 为了效率只会替换相同标签内部的内容。即使在技术上没有必要,给在 <transition> 组件中的多个元素设置 key 是一个更好的实践。

示例:

<transition>
 <button v-if="isEditing" key="save">
  Save
 </button>
 <button v-else key="edit">
  Edit
 </button>
</transition>

在一些场景中,也可以给通过给同一个元素的 key特性设置不同的状态来代替v-if和 v-else,上面的例子可以重写为:

<transition>
 <button v-bind:key="isEditing">
  {{ isEditing ? 'Save' : 'Edit' }}
 </button>
</transition>

使用多个 v-if 的多个元素的过渡可以重写为绑定了动态属性的单个元素过渡。 例如:

<transition>
 <button v-if="docState === 'saved'" key="saved">
  Edit
 </button>
 <button v-if="docState === 'edited'" key="edited">
  Save
 </button>
 <button v-if="docState === 'editing'" key="editing">
  Cancel
 </button>
</transition>

可以重写为:

<transition>
 <button v-bind:key="docState">
  {{ buttonMessage }}
 </button>
</transition>
computed: {
 buttonMessage: function () {
  switch (this.docState) {
   case 'saved': return 'Edit'
   case 'edited': return 'Save'
   case 'editing': return 'Cancel'
  }
 }
}

过渡模式

在元素之间的过渡中,还存在一个问题:两个元素都被重绘了,一个离开过渡的时候另一个开始进入过渡。这是 <transition>的默认行为 - 进入和离开同时发生。

有一种最原始的解决方法就是,在元素绝对定位在彼此之上的时候运行正常。

还有一种方法就是使用Vue 提供的过渡模式.

  1. in-out: 新元素先进行过渡,完成之后当前元素过渡离开。
  2. out-in: 当前元素先进行过渡,完成之后新元素过渡进入。

用 out-in重写之前的开关按钮过渡:

<transition name="fade" mode="out-in">
 <!-- ... the buttons ... -->
</transition>

多元素过渡的例子

v-if和v-else的绝对定位实例

<div class="my-div" id="app">
  <transition name="fade">
    <button class="btn" :key="show" @click="show=!show">{{show ? 'on' : 'off'}}</button>
    <!--<button key="on" v-if="show" class="btn" @click="show = !show">on</button>-->
    <!--<button key="off" v-else class="btn" @click="show = !show">off</button>-->
  </transition>
</div>
.my-div{
      position: relative;
    }
    .btn{
      position: absolute;
      left: 30px;
      top: 10px;
    }

    .fade-enter-active, .fade-leave-active{
      transition: opacity .5s;
    }
    .fade-enter, .fade-leave-to{
      opacity: 0;
    }
new Vue({
  el:'#app',
  data:{
    show : true
  }
})

多个v-if的例子

<div class="my-div" id="app">
  <transition name="fade">
    <button class="btn" :key="key" >{{btnContent}}</button>
  </transition>
</div>
.my-div{
      position: relative;
    }
    .btn{
      position: absolute;
      left: 30px;
      top: 10px;
    }

    .fade-enter-active, .fade-leave-active{
      transition: opacity .5s;
    }
    .fade-enter, .fade-leave-to{
      opacity: 0;
    }
var app = new Vue({
  el:'#app',
  data:{
    key:'add'
  },
  computed:{
    btnContent:function () {
      switch (this.key){
        case 'add' : return 'Add'
        case 'edit' : return 'Edit'
        case 'delete' : return 'Delete'
      }
    }
  }
})

这里我没有做对app.key的值的控制,所以想看过渡效果的话,可以在控制台里修改app.key的值。

过渡模式的例子

<div id="app">
  <transition name="fade" mode="out-in">
    <button :key="show" @click="show=!show">{{show ? 'on' : 'off'}}</button>
  </transition>
</div>
.fade-enter-active, .fade-leave-active{
      transition: opacity .5s;
    }
    .fade-enter, .fade-leave-to{
      opacity: 0;
    }
new Vue({
  el:'#app',
  data:{
    show : true
  }
})

多组件过渡

多个组件的过渡简单很多 - 我们不需要使用 key 特性。相反,我们只需要使用动态组件,情况一下例子:

<div id="app">
  <transition name="fade" mode="out-in">
    <component :is="view"></component>
  </transition>
</div>
.fade-enter-active, .fade-leave-active{
      transition: opacity .5s;
    }
    .fade-enter, .fade-leave-to{
      opacity: 0;
    }
var app = new Vue({
  el:'#app',
  data:{
    view:'v-a'
  },
  components:{
    'v-a':{
      template:'<div> component a </div>'
    },
    'v-b':{
      template:'<div> component b </div>'
    },
  }
})

在控制台中修改app.view的值便可看到过渡效果。

以上示例中的过渡动画,都可以自己定义,也可以使用上一节提到的自定义class已经钩子函数等,在这里就不做详细介绍了。

感谢阅读,希望能帮助到大家,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 文字符串转换unicode编码函数
May 30 Javascript
Underscore.js常用方法总结
Feb 28 Javascript
深入理解jQuery 事件处理
Jun 14 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
bootstrap css样式之表单
Jan 19 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
Jul 11 Javascript
jQuery中库的引用方法
Jan 06 jQuery
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 Javascript
vue2.0 循环遍历加载不同图片的方法
Mar 06 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 #Javascript
Vue之Watcher源码解析(2)
Jul 19 #Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
Jul 19 #Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 #Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
Jul 19 #Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 #Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 #jQuery
You might like
AM/FM收音机的安装与调试
2021/03/02 无线电
PHP与SQL注入攻击[三]
2007/04/17 PHP
PHP 字符串 小常识
2009/06/05 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP strripos函数用法总结
2019/02/11 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python实现年会抽奖程序
2019/01/22 Python
用Python解决x的n次方问题
2019/02/08 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
日语系毕业生推荐信
2013/11/11 职场文书
工程招投标邀请书
2014/01/26 职场文书
求职自我推荐信
2014/06/25 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
商务宴会祝酒词
2015/08/11 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
springboot读取resources下文件的方式详解
2022/06/21 Java/Android