中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue 2.0如何實現購物車小球拋物線

發布時間:2021-07-21 09:43:57 來源:億速云 閱讀:171 作者:小新 欄目:web開發

這篇文章主要介紹了vue 2.0如何實現購物車小球拋物線,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

具體如下:

備注:此項目模仿 餓了嗎。我用的是最新的Vue, 視頻上的一些寫法已經被廢棄了。

布局代碼

<div class="ball-container">
 <transition name="drop"
       v-for="ball in balls"
       @before-enter="beforeDrop"
       @enter="dropping"
       @after-enter="afterDrop">
  <div v-show="ball.show" class="ball" v-bind:css="false">
   <div class="inner inner-hook" ></div>
  </div>
 </transition>
</div>

css代碼(使用stylus寫法)

.ball-container
 .ball
  position fixed
  left 32px
  bottom 22px
  z-index 200
  transition all 0.4s cubic-bezier(0.49,-0.29,0.75,0.41)
  .inner
   width 16px
   height 16px
   border-radius 50%
   background-color rgb(0,160,220)
   transition all 0.4s linear

js代碼

data() {
  return {
   balls : [
    {
     show: false
    },
    {
     show: false
    },
    {
     show: false
    },
    {
     show: false
    },
    {
     show: false
    }
   ],
   dropBalls: []
  };
},   
methods: {
  drop(el) {
   for(let i = 0; i < this.balls.length; i++) {
    let ball = this.balls[i];
    if(!ball.show) {
     ball.show = true;
     ball.el = el;
     this.dropBalls.push(ball);
     return ;
    }
   }
  }
  beforeDrop(el) {
   let count = this.balls.length;
   while (count--) {
    let ball = this.balls[count];
    if(ball.show) {
     let rect = ball.el.getBoundingClientRect();
     let x = rect.left - 32;
     let y = -(window.innerHeight - rect.top - 22);
     el.style.webkitTransform = `translate3d(0,${y}px,0)`;
     el.style.transform = `translate3d(0,${y}px,0)`;
     let inner = el.getElementsByClassName('inner-hook')[0];
     inner.style.webkitTransform = `translate3d(${x}px,0,0)`;
     inner.style.transform = `translate3d(${x}px,0,0)`;
    }
   }
  },
  dropping(el) {
   /* eslint-disable no-unused-vars */
   let rf = el.offsetHeight;
   this.$nextTick(() => {
    el.style.webkitTransform = 'translate3d(0,0,0)';
    el.style.transform = 'translate3d(0,0,0)';
    let inner = el.getElementsByClassName('inner-hook')[0];
    inner.style.webkitTransform = 'translate3d(0,0,0)';
    inner.style.transform = 'translate3d(0,0,0)';
   });
  },
  afterDrop(el){
   let ball = this.dropBalls.shift();
   if(ball) {
    ball.show = false;
    el.style.display = 'none';
   }
  }
}

getBoundingClientRect()。方法請閱讀這篇文章https://www.jb51.net/article/134208.htm

說明:

goods 是一個組件,里面包含menu(div) , foods(div), shopcart(購物車組件)。其中foods 包含cartcontrol(即小球組件)

組件之間的通信:說明:菜單和商品

第1個問題:小球,需要獲取所點擊的商品的數量。

利用Vue的props,將foods值傳遞給cartcontrol。但是這樣有個問題。即子組件更新,無法同步回父組件。且,在子組件中,對food注冊了一個count屬性,此屬性也無法同步回父組件(goods)。

解決方法:

導入全局的Vue。

利用Vue.set(target,key,value); 對 target注冊count;

第2個問題:小球點擊,將所點擊過的商品數目傳遞給 shopcart。

在goods的 computed:{} 定義一個方法,將該方法以props的方式,傳遞給shopcart。

因為,shopcart,對傳遞過去的數據僅數據運算(不會改變)。因此不用同步會父組件。

第3個問題:購物車小球做拋物線運動。

對于購物車小球做拋物線運動。首先,落點都在購物車,小球則是隨機的。要做拋物線運動,就要獲取,所點擊的 + 號的x,y位置。其次,拋物線運動,只有在enter--> enter-to這段期間有,在leave--> leave-to 期間是沒有的,因此,需要用Vue提供的鉤子函數。

獲取 + 號x,y 位置:

小球(cartcontrol)是子組件。需要把數據傳遞給 goods(父組件)。可以使用Vuex,或者直接使用事件總線。對于餓了嗎demo。直接使用事件總線。

創建一個 空的Vue。在 cartcontrol 中 ,通過 Bus.$emit(key, ... arg); 注冊一個監聽,然后再父組件 通過Bus.$on(key, function(... arg));監聽此方法。將所操作的 dom 對象傳遞過去即可

Vue提供的鉤子

這里要說明一點,Vue在他的官網,對于只有過度的js,done是必須的,當我加上done的時候,after-enter方法無法被執行。
還有1個問題,Vue官網推薦,只有過度效果,在做過度動畫的元素上加上v-bind:class='false'。之前沒加,出現了,小球只能在第1次點擊的地方做過度效果。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“vue 2.0如何實現購物車小球拋物線”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

安陆市| 成安县| 汾西县| 鹿邑县| 甘肃省| 桐柏县| 临朐县| 富源县| 嘉禾县| 芜湖县| 科尔| 宁武县| 平谷区| 和政县| 郸城县| 鸡西市| 高陵县| 乐亭县| 海林市| 东方市| 通州区| 固阳县| 襄樊市| 瑞丽市| 繁峙县| 固始县| 沁阳市| 渝北区| 新化县| 嵊泗县| 长丰县| 海林市| 哈密市| 个旧市| 乐昌市| 台州市| 阿坝| 利川市| 穆棱市| 马龙县| 龙井市|