vue 2.0 购物车小球抛物线的示例代码


Posted in Javascript onFebruary 01, 2018

本文介绍了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://3water.com/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次点击的地方做过度效果。

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

Javascript 相关文章推荐
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
Dec 18 Javascript
Bootstrap实现默认导航栏效果
Sep 21 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 Javascript
JavaScript 对象字面量讲解
Jun 06 Javascript
js生成随机数方法和实例
Jan 17 Javascript
js canvas实现放大镜查看图片功能
Jun 08 Javascript
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 24 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 Javascript
深入浅析React中diff算法
May 19 Javascript
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 #Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 #Javascript
JS 实现百度搜索功能
Feb 01 #Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
Feb 01 #Javascript
微信小程序日期时间选择器使用方法
Feb 01 #Javascript
NW.js 简介与使用方法
Feb 01 #Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 #Javascript
You might like
php快递单号查询接口使用示例
2014/05/05 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
javascript 必知必会之closure
2009/09/21 Javascript
使用js画图之画切线
2015/01/12 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
vue-router单页面路由
2017/06/17 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python实现简单字典树的方法
2016/04/29 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
对Python信号处理模块signal详解
2019/01/09 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
下载官网python并安装的步骤详解
2019/10/12 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
枚举与#define宏的区别
2014/04/30 面试题
党员反对四风问题思想汇报
2014/09/12 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书