Vue学习笔记进阶篇之过渡状态详解


Posted in Javascript onJuly 14, 2017

这两天学习了Vue.js 感觉渡系统这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。

Vue 的过渡系统提供了非常多简单的方法设置进入、离开和列表的动效。那么对于数据元素本身的动效呢,比如:

  1. 数字和运算
  2. 颜色的显示
  3. SVG 节点的位置
  4. 元素的大小和其他的属性

所有的原始数字都被事先存储起来,可以直接转换到数字。做到这一步,我们就可以结合 Vue 的响应式和组件系统,使用第三方库来实现切换元素的过渡状态。

状态动画和watcher

通过 watcher 我们能监听到任何数值属性的数值更新。可能听起来很抽象,所以让我们先来看看使用 Tweenjs 一个例子。

Js代码中引入:

<script src="https://unpkg.com/tween.js@16.3.4"></script>

示例代码:

<div id="app1">
  <input v-model.number="number" type="number" step="20">
  <p>{{animateNumber}}</p>
</div>
var app1 = new Vue({
  el:'#app1',
  data:{
    number:0,
    animateNumber:0
  },
  watch:{
    number:function (newVal, oldVal) {
      var vm = this
      function animate() {
        if (TWEEN.update()){
          requestAnimationFrame(animate)
        }
      }

      new TWEEN.Tween({tweeningNumber:oldVal})
        .easing(TWEEN.Easing.Quadratic.Out)
        .to({tweeningNumber:newVal}, 500)
        .onUpdate(function () {
          vm.animateNumber = this.tweeningNumber.toFixed(0)
        })
        .onComplete(function () {
          cancelAnimationFrame(animate)
        })
        .start()
      animate()
    }
  }
})

运行结果:

Vue学习笔记进阶篇之过渡状态详解

当你把数值更新时,就会触发动画。这个是一个不错的演示,但是对于不能直接像数字一样存储的值,比如 CSS 中的 color 的值,通过下面的例子我们来通过 Color.js 实现一个例子。

js需要添加以下引用:

<script src="https://unpkg.com/tween.js@16.3.4"></script>
<script src="https://unpkg.com/color-js@1.0.3/color.js"></script>

示例代码:

<div id="app-color">
  <input v-model="colorQuery" @keyup.enter="updateColor" placeholder="Enter a color">
  <button @click="updateColor">Update</button>
  <p>Preview:</p>
  <span :style="{backgroundColor:tweenedCSSColor}" class="color-preview">

  </span>
  <p>{{tweenedCSSColor}}</p>
</div>
var Color = net.brehaut.Color
new Vue({
  el:'#app-color',
  data:{
    colorQuery:'',
    color:{
      red:0,
      green:0,
      blue:0,
      alpha:1
    },
    tweenedColor:{}
  },
  created:function () {
    this.tweenedColor = Object.assign({}, this.color)
  },
  watch:{
    color:function () {
      function animate() {
        if (TWEEN.update()){
          requestAnimationFrame(animate)
        }
      }
      new TWEEN.Tween(this.tweenedColor)
        .to(this.color, 750)
        .start()
      animate()
    }
  },
  computed:{
    tweenedCSSColor:function () {
      return new Color({
        red:this.tweenedColor.red,
        green:this.tweenedColor.green,
        blue:this.tweenedColor.blue,
        alpha:this.tweenedColor.alpha
      }).toCSS()
    }
  },
  methods:{
    updateColor:function () {
      this.color = new Color(this.colorQuery).toRGB()
      this.colorQuery = ''
    }
  }
})

运行结果:

Vue学习笔记进阶篇之过渡状态详解

通过组件组织过渡

管理太多的状态转换会很快的增加 Vue 实例或者组件的复杂性,幸好很多的动画可以提取到专用的子组件。

我们来将之前的示例改写一下:

<div id="app">
  <input v-model.number="firstNumber" type="number" step="20"> +
  <input v-model.number="secondNumber" type="number" step="20"> =
  {{result}}
  <p>
    <animate-integer :value="firstNumber"></animate-integer> +
    <animate-integer :value="secondNumber"></animate-integer> =
    <animate-integer :value="result"></animate-integer>
  </p>
</div>
Vue.component('animate-integer',{
  template:'<span>{{tweeningValue}}</span>',
  props:{
    value:{
      type:Number,
      required:true
    }
  },
  data:function () {
    return {tweeningValue:0}
  },
  mounted:function () {
    this.tween(0, this.value)
  },
  watch:{
    value:function (newVal, oldVal) {
      this.tween(oldVal, newVal)
    }
  },
  methods:{
    tween:function (startValue, endValue) {
      var vm = this
      function animate() {
        if(TWEEN.update()){
        requestAnimationFrame(animate)
        }
      }
      new TWEEN.Tween({tweeningValue:startValue})
        .to({tweeningValue:endValue}, 500)
        .onUpdate(function () {
          vm.tweeningValue = this.tweeningValue.toFixed(0)
        }).start()
      animate()
    }
  }
})

new Vue({
  el:'#app',
  data:{
    firstNumber:20,
    secondNumber:40
  },
  computed:{
    result:function () {
      return this.firstNumber + this.secondNumber
    }
  }
})

运行结果:

Vue学习笔记进阶篇之过渡状态详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
判定是否原生方法的JS代码
Nov 12 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
js实现简单计算器
Nov 22 Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
输入框点击时边框变色效果的实现方法
Dec 26 Javascript
vue.js实现刷新当前页面的方法教程
Jul 05 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
Nov 13 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
Jul 14 #Javascript
使用OPENLAYERS3实现点选的方法
Sep 24 #Javascript
vue component组件使用方法详解
Jul 14 #Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 #Javascript
Vue filters过滤器的使用方法
Jul 14 #Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 #Javascript
Vue computed计算属性的使用方法
Jul 14 #Javascript
You might like
PHP7匿名类的用法示例
2019/04/05 PHP
用jscript实现新建word文档
2007/06/15 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
浅析Javascript使用include/require
2013/11/13 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
Python线程详解
2015/06/24 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
美国钻石商店:Zales
2016/11/20 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
奥利奥广告词
2014/03/20 职场文书
超市中秋节促销方案
2014/03/21 职场文书
教师专业自荐信
2014/05/31 职场文书
青年文明号口号
2014/06/17 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
2014年副班长工作总结
2014/12/10 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
基于docker安装zabbix的详细教程
2022/06/05 Servers
VUE递归树形实现多级列表
2022/07/15 Vue.js