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 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 Javascript
浅谈jquery的html方法里包含特殊字符的处理
Nov 30 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 Javascript
Vue 中使用 CSS Modules优雅方法
Apr 09 Javascript
微信小程序登录session的使用
Mar 17 Javascript
全面解析JavaScript Module模式
Jul 24 Javascript
js实现详情页放大镜效果
Oct 28 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
python安装requests库的实例代码
2019/06/25 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
Django实现简单的分页功能
2021/02/22 Python
会计系毕业个人自荐信格式
2013/09/23 职场文书
网站编辑求职信
2013/10/17 职场文书
主题教育活动总结
2014/05/05 职场文书
新闻传播专业求职信
2014/07/22 职场文书
面试感谢信范文
2015/01/22 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
python中pycryto实现数据加密
2022/04/29 Python
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL