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 相关文章推荐
JavaScript监测ActiveX控件是否已经安装过的代码
Sep 02 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
Jan 05 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
Jun 07 Javascript
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
浅谈FastClick 填坑及源码解析
Mar 02 Javascript
vue实现循环切换动画
Oct 17 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
Aug 26 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
学习十八大精神心得体会
2013/12/31 职场文书
运动会获奖感言
2014/02/11 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
店铺转让协议书
2015/01/29 职场文书
学风建设主题班会
2015/08/17 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书