- 状态动画与侦听器
状态动画与侦听器
通过侦听器我们能监听到任何数值属性的数值更新。可能听起来很抽象,所以让我们先来看看使用 GreenSock 一个例子:
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script><div id="animated-number-demo"><input v-model.number="number" type="number" step="20"><p>{{ animatedNumber }}</p></div>
new Vue({el: '#animated-number-demo',data: {number: 0,tweenedNumber: 0},computed: {animatedNumber: function() {return this.tweenedNumber.toFixed(0);}},watch: {number: function(newValue) {TweenLite.to(this.$data, 0.5, { tweenedNumber: newValue });}}})

当你把数值更新时,就会触发动画。这个是一个不错的演示,但是对于不能直接像数字一样存储的值,比如 CSS 中的 color 的值,通过下面的例子我们来通过 Tween.js 和 Color.js 实现一个例子:
<script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script><script src="https://cdn.jsdelivr.net/npm/color-js@1.0.3"></script><div id="example-7"><inputv-model="colorQuery"v-on:keyup.enter="updateColor"placeholder="Enter a color"><button v-on:click="updateColor">Update</button><p>Preview:</p><spanv-bind:style="{ backgroundColor: tweenedCSSColor }"class="example-7-color-preview"></span><p>{{ tweenedCSSColor }}</p></div>
var Color = net.brehaut.Colornew Vue({el: '#example-7',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 = ''}}})
.example-7-color-preview {display: inline-block;width: 50px;height: 50px;}

