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 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
javascript 尚未实现错误解决办法
Nov 27 Javascript
一个js的tab切换效果代码[代码分离]
Apr 11 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
Aug 14 Javascript
JavaScript编程的单例设计模讲解
Nov 10 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
Node.js Buffer用法解读
May 18 Javascript
微信网页授权并获取用户信息的方法
Jul 30 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
原型和原型链 prototype和proto的区别详情
Nov 02 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
11个PHP 分页脚本推荐
2011/08/15 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
php查询ip所在地的方法
2014/12/05 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
php支付宝APP支付功能
2020/07/29 PHP
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
python如何实现代码检查
2019/06/28 Python
用Python配平化学方程式的方法
2019/07/20 Python
python numpy 反转 reverse示例
2019/12/04 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
Python 在局部变量域中执行代码
2020/08/07 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
舞蹈比赛获奖感言
2014/02/04 职场文书
爱国演讲稿500字
2014/05/04 职场文书
煤矿安全承诺书
2014/05/22 职场文书
欢迎横幅标语
2014/06/17 职场文书
银行求职自荐书
2014/06/25 职场文书
搞笑婚前保证书
2015/02/28 职场文书
Python 键盘事件详解
2021/11/11 Python