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 Event学习第二章 Event浏览器兼容性
Feb 07 Javascript
JSQL SQLProxy 的 php 版本代码
May 05 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
Sep 19 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
JS自动适应的图片弹窗实例
Jun 29 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
Jan 01 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
Jun 21 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
vue 里面使用axios 和封装的示例代码
Sep 01 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
微信小程序性能优化之checkSession的使用
Mar 06 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
php中的依赖注入实例详解
2019/08/14 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
Python有序查找算法之二分法实例分析
2017/12/11 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
2019/02/12 Python
Python基础学习之时间转换函数用法详解
2019/06/18 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
作弊检讨书1000字
2014/02/01 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
迎新生欢迎词
2015/01/23 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python