亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于Vue過渡狀態實例講解

2019-11-19 15:27:28
字體:
來源:轉載
供稿:網友

前面的話

Vue 的過渡系統提供了非常多簡單的方法設置進入、離開和列表的動效。那么對于數據元素本身的動效呢?包括數字和運算、顏色的顯示、SVG 節點的位置、元素的大小和其他的屬性等。所有的原始數字都被事先存儲起來,可以直接轉換到數字。做到這一步,我們就可以結合 Vue 的響應式和組件系統,使用第三方庫來實現切換元素的過渡狀態

狀態動畫

通過watcher,能監聽到任何數值屬性的數值更新

<div id="animated-number-demo"> <input v-model.number="number" type="number" step="20"> <p>{{ animatedNumber }}</p></div><script src="Tween.js"></script><script src="vue.js"></script> <script>new Vue({ el: '#animated-number-demo', data: { number: 0, animatedNumber: 0 }, watch: { number: function(newValue, oldValue) {  var vm = this;  function animate () {  if (TWEEN.update()) {   requestAnimationFrame(animate)  }  }  new TWEEN.Tween({ tweeningNumber: oldValue })  .easing(TWEEN.Easing.Quadratic.Out)  .to({ tweeningNumber: newValue }, 500)  .onUpdate(function () {   vm.animatedNumber = this.tweeningNumber.toFixed(0)  })  .start();  animate() } }}) </script>

當把數值更新時,就會觸發動畫。這個是一個不錯的演示,但是對于不能直接像數字一樣存儲的值,比如 CSS 中的 color 的值,通過下面的例子來通過 Color.js 實現一個例子:

<div id="example"> <input v-model="colorQuery" @keyup.enter="updateColor" placeholder="Enter a color"> <button @click="updateColor">Update</button> <p>Preview:</p> <span :style="{ backgroundColor: tweenedCSSColor }" style="display: inline-block;width: 50px;height: 50px;"></span> <p>{{ tweenedCSSColor }}</p></div><script src="Tween.js"></script><script src="vue.js"></script> <script src="color.js"></script><script>var Color = net.brehaut.Colornew Vue({ el: '#example', 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 = '' } }})</script>

動態狀態轉換

就像 Vue 的過渡組件一樣,數據背后狀態轉換會實時更新,這對于原型設計十分有用。當修改一些變量,即使是一個簡單的 SVG 多邊形也可以實現很多難以想象的效果

<style>svg,input[type="range"]{display:block;} </style><div id="app"> <svg width="200" height="200"> <polygon :points="points" fill="#41B883"></polygon> <circle cx="100" cy="100" r="90" fill=" transparent" stroke="#35495E"></circle> </svg> <label>Sides: {{ sides }}</label> <input type="range" min="3" max="500" v-model.number="sides"> <label>Minimum Radius: {{ minRadius }}%</label> <input type="range" min="0" max="90" v-model.number="minRadius"> <label>Update Interval: {{ updateInterval }} milliseconds</label> <input type="range" min="10" max="2000" v-model.number="updateInterval"></div> <script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/vue.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.5/TweenLite.min.js"></script><script>new Vue({ el: '#app', data: function () { //默認有10條邊 var defaultSides = 10; //默認地,stats = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100] var stats = Array.apply(null, { length: defaultSides })  .map(function () { return 100 }) return {  stats: stats,  points: generatePoints(stats),  sides: defaultSides,  minRadius: 50,  interval: null,  updateInterval: 500 } }, watch: { sides: function (newSides, oldSides) {  //計算設置的邊數與默認的邊數的差值  var sidesDifference = newSides - oldSides  //如果大于默認邊數  if (sidesDifference > 0) {   //增加相應數量的隨機值到stats數組中   for (var i = 1; i <= sidesDifference; i++) {    this.stats.push(this.newRandomValue())   }  }else{   //否則,計算出差值   var absoluteSidesDifference = Math.abs(sidesDifference)   //從stats數組末尾減少相應數量的數組值   for (var i = 1; i <= absoluteSidesDifference; i++) {    this.stats.shift()   }  } }, stats: function (newStats) {  TweenLite.to(   this.$data,    this.updateInterval / 1000,    { points: generatePoints(newStats) }  ) }, updateInterval: function () {  this.resetInterval() } }, mounted: function () { this.resetInterval() }, methods: { //將stats里面的值都變成50-100的隨機值 randomizeStats: function () {  var vm = this  this.stats = this.stats.map(function () {  return vm.newRandomValue()  }) }, newRandomValue: function () {  //產生一個50-100的隨機半徑  return Math.ceil(this.minRadius + Math.random() * (100 - this.minRadius)) }, //重啟定時器 resetInterval: function () {  var vm = this;  clearInterval(this.interval);  this.randomizeStats();  this.interval = setInterval(function () {    vm.randomizeStats();  }, this.updateInterval) } }})function valueToPoint (value, index, total) { var x  = 0 var y  = -value * 0.9 var angle = Math.PI * 2 / total * index var cos = Math.cos(angle) var sin = Math.sin(angle) var tx = x * cos - y * sin + 100 var ty = x * sin + y * cos + 100 return { x: tx, y: ty }}//計算polygon中的路徑點的值function generatePoints (stats) { var total = stats.length return stats.map(function (stat, index) {  var point = valueToPoint(stat, index, total)  return point.x + ',' + point.y }).join(' ')}</script>

組件組織過渡

管理太多的狀態轉換會很快的增加 Vue 實例或者組件的復雜性,幸好很多的動畫可以提取到專用的子組件

<div id="example"> <input v-model.number="firstNumber" type="number" step="20"> + <input v-model.number="secondNumber" type="number" step="20"> = {{ result }} <p> <animated-integer :value="firstNumber"></animated-integer> + <animated-integer :value="secondNumber"></animated-integer> = <animated-integer :value="result"></animated-integer> </p></div><script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/vue.js"></script><script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/Tween.js"></script><script>Vue.component('animated-integer', { template: '<span>{{ tweeningValue }}</span>', props: { value: {  type: Number,  required: true } }, data: function () { return {  tweeningValue: 0 } }, watch: { value: function (newValue, oldValue) {  this.tween(oldValue, newValue) } }, mounted: function () { this.tween(0, this.value) }, 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: '#example', data: { firstNumber: 20, secondNumber: 40 }, computed: { result: function () {  return this.firstNumber + this.secondNumber } }})</script>

以上這篇基于Vue過渡狀態實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久色| 精品久久久av| 欧美一级大片在线观看| 国产精品自产拍高潮在线观看| 成人免费福利在线| 国产精品久久在线观看| 欧美在线观看一区二区三区| 亚洲性猛交xxxxwww| 26uuu另类亚洲欧美日本老年| 97精品国产91久久久久久| 亚洲精品福利视频| 97超级碰碰人国产在线观看| 国产精品久久久久一区二区| 欧美日韩免费在线| 欧美极品第一页| 亚洲永久在线观看| 日本a级片电影一区二区| 欧美国产高跟鞋裸体秀xxxhd| 日韩欧美一区二区在线| 久久视频中文字幕| 国产在线视频91| 成人黄色激情网| 国语对白做受69| 国产精品扒开腿做爽爽爽的视频| 日韩视频在线免费观看| 日韩精品免费在线视频观看| 亚洲国产三级网| 国产视频亚洲视频| 中文字幕在线日韩| www.亚洲男人天堂| 亚洲激情中文字幕| 一区二区三区天堂av| 亚州av一区二区| 亚洲开心激情网| 国产成人精品a视频一区www| 久久久www成人免费精品| 97色在线视频观看| 亚洲自拍欧美另类| 国产女同一区二区| 日韩午夜在线视频| 亚洲精品自拍视频| 欧美激情精品久久久久久黑人| 欧美韩日一区二区| 欧美午夜久久久| 精品久久久香蕉免费精品视频| 日韩高清电影免费观看完整| 久久精品视频在线播放| 国产精品久久久久7777婷婷| 日韩中文字幕网站| 欧美激情视频网址| 欧美黑人一级爽快片淫片高清| 欧美色道久久88综合亚洲精品| 一个人看的www久久| 成人免费看吃奶视频网站| 久久久久国产精品www| 久久久999国产精品| 日韩欧美国产中文字幕| 日韩成人网免费视频| 亚洲色图综合久久| 日本91av在线播放| 亚洲国产高清福利视频| 亚洲一区二区三区sesese| 亚洲国产精久久久久久久| 国产一区二区三区在线播放免费观看| 另类少妇人与禽zozz0性伦| 欧美日韩福利在线观看| 欧美大人香蕉在线| 国产精品久久久久久久久久新婚| 国产精品一区久久| 在线视频精品一| 国产精品一区二区电影| 成人激情免费在线| 日本精品一区二区三区在线| 亚洲a中文字幕| 欧美理论片在线观看| 国产91精品黑色丝袜高跟鞋| 国产亚洲精品久久久优势| 日韩精品视频在线观看免费| 日韩欧美中文第一页| 欧美洲成人男女午夜视频| 一本一本久久a久久精品综合小说| 91亚洲精华国产精华| 国产精品福利网站| 精品免费在线观看| 日韩欧美一区视频| 久久久久久久久久久国产| 国产suv精品一区二区| 中文字幕在线看视频国产欧美| 欧美黑人一区二区三区| 久久久免费av| 亚洲天堂一区二区三区| 欧美国产激情18| 97精品在线视频| 中文欧美日本在线资源| 久久久久久国产免费| 久久久国产精品一区| 欧美精品videos性欧美| 一区二区在线视频播放| 亚洲黄页网在线观看| 97精品一区二区三区| 国产精品盗摄久久久| 在线国产精品播放| 亚洲欧洲在线观看| 8x海外华人永久免费日韩内陆视频| 国产成人一区三区| 亚洲 日韩 国产第一| 亚洲欧洲在线播放| 色七七影院综合| 91情侣偷在线精品国产| 久久激情视频久久| 欧美在线一区二区三区四| 欧美疯狂性受xxxxx另类| 青青草成人在线| 97视频国产在线| 久久国产精品影片| 欧美亚洲国产视频小说| 久久在精品线影院精品国产| 亚洲精品中文字幕有码专区| 欧美激情精品在线| 国产欧美一区二区三区在线看| 国产91精品高潮白浆喷水| 日韩成人激情影院| 久久999免费视频| 日韩免费在线视频| 日韩av一区二区在线观看| 亚洲开心激情网| 国产69精品久久久| 久久久国产成人精品| 久久久久久久久久久免费| 国模视频一区二区三区| 国产精品黄视频| 久久久久久国产精品| 国产精品青青在线观看爽香蕉| 久久久久久999| 96精品久久久久中文字幕| 国产精品成人免费视频| 亚洲一区二区久久| 午夜精品三级视频福利| 中文字幕无线精品亚洲乱码一区| 欧美极品欧美精品欧美视频| 91免费精品国偷自产在线| 高清欧美性猛交xxxx黑人猛交| 亚洲在线一区二区| 亚洲自拍另类欧美丝袜| 久久视频国产精品免费视频在线| 538国产精品视频一区二区| 中文字幕日韩av电影| 久久精品人人做人人爽| 国产精品视频大全| 国产三级精品网站| 欧美性生交xxxxx久久久| 亚洲国产高清自拍| 国产精品人人做人人爽| 奇米影视亚洲狠狠色| 久久久久久久电影一区| 精品毛片网大全| 2019日本中文字幕| 97视频网站入口| 日韩欧美主播在线| 日韩免费观看av| 亚洲欧美激情一区| 精品视频久久久久久| 午夜精品久久久久久久男人的天堂| 国产精品久久av|