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 相关文章推荐
datePicker——日期选择控件(with jquery)
Feb 20 Javascript
jQuery选择器全面总结
Jan 06 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
May 04 Javascript
跟我学习javascript的隐式强制转换
Nov 16 Javascript
JS创建对象几种不同方法详解
Mar 01 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
Sep 17 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
解析Vue.js中的组件
Feb 02 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
ant design的table组件实现全选功能以及自定义分页
Nov 17 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
文件上传类
2006/10/09 PHP
php给图片加文字水印
2015/07/31 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
Python sys模块常用方法解析
2020/02/20 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
初一体育教学反思
2014/01/29 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
开学典礼策划方案
2014/05/28 职场文书
党员干部一句话承诺
2014/05/30 职场文书
银行业务授权委托书
2014/10/10 职场文书
节约用电通知
2015/04/25 职场文书
解除租赁合同协议书
2016/03/21 职场文书