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 相关文章推荐
json原理分析及实例介绍
Nov 29 Javascript
Extjs优化(二)Form表单提交通用实现
Apr 15 Javascript
from 表单提交返回值用post或者是get方法实现
Aug 21 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
Sep 16 Javascript
JavaScript中String对象的方法介绍
Jan 04 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 Javascript
vue的事件绑定与方法详解
Aug 16 Javascript
JavaScript 异步调用
Oct 25 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
Jul 27 Javascript
微信小程序request请求封装,验签代码实例
Dec 04 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 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操作excel文件 基于phpexcel
2010/07/02 PHP
php递归json类实例
2014/12/02 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
php正则修正符用法实例详解
2016/12/29 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
vue基本使用--refs获取组件或元素的实例
2019/11/07 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
深入源码解析Python中的对象与类型
2015/12/11 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
Python基础之条件控制操作示例【if语句】
2019/03/23 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
出纳岗位职责
2013/11/09 职场文书
优秀教师演讲稿
2014/05/06 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
道歉的话语大全
2015/05/12 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python