Vue shopCart 组件开发实例详解

本文主要和大家介绍vue shopcart 组件开发详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

一、shopCart组件

(1) goods 父组件和 子组件 shopCart 传参

deliveryPrice:{ // 单价 从json seller 对象数据中获取 type:Number, default:0},minPrice:{ // 最低起送价 从json seller 对象数据中获取 type:Number, default:20}

登录后复制

其中 deliveryPrice 和 minPrice 的数据都是从 data.json数据 中 seller 对象下 获得。所以在goods 组件中还要 获取到 seller对象 的数据,否则会报错:

[Vue warn]: Error in render: “TypeError: Cannot read property ‘deliveryPrice’ of undefined”

解决方法:根组件 App.vue 中 router-view 组件获取seller 数据,传到 goods 组件中

立即学习“前端免费学习笔记(深入)”;

1-1.app.vue (根组件 也是 goods 的父组件)

 

登录后复制

注意:sellerObj 是data 定义 的 对象里用来接收 data.json 数据,相当于 实参

1-2.goods.vue (相对于跟组件的子组件 且 shopCart 的父组件)

通过props 属性 进行组件之间的通信

props: {  sell: Object // 相当于 形参 },

登录后复制

1-3.shopCart.vue ( goods 的子组件)


登录后复制

(2) 选中商品 的 计算功能

1-1. 传入用户选中商品的集合

说明:从父组件会 传入一个用户选中商品的 数组,数组里会存放着 n 个对象,每个对象里存放着该 商品的 价格 和 数量。

props:{       // 通过父组件传过来的 ( 相当于形参 ) selefoodsArr:{   // 用户选中的商品存放在一个数组里  接收的是 data.json数据的 goods(数组) type:Array, // 当父组件传过来的 类型是对象或者 是数组时, default 就是一个函数 default (){ return []  // 返回数组 存放着选中 商品 对应的 goods下的 foods 数组(由 父组件 的 实参 决定的返回值) }}

登录后复制

1-2. 利用计算属性 选中商品数量的变化,商品总价,动态改变描述等功能

computed:{ totalPrice (){     //计算总价,超过起送额度后提示可付款 let total=0   // 定义一个返回值 this.selefoodsArr.forEach((rfoods) =>{ // 遍历 这个 goods 数组 取到 价格 和 数量 (当然在这里数据库没有count 这个属性,稍后 我们会利用 vue.set() 新建一个count 属性)  total += rfoods.price * rfoods.count // 形参 rfoods 实参 是 foods }); return total; }, totalCount (){   // //计算选中的food数量,在购物车图标处显示,采用绝对定位,top:0;right:0;显示在购物车图标右上角   let count=0 this.selefoodsArr.forEach((rfoods) =>{ // 形参 rfoods 实参 是 foods  count += rfoods.count }); return count; }, payDesc (){    //控制底部右边内容随food的变化而变化,payDesc()控制显示内容,enough 添加类调整显示样式 let diff = this.minPrice - this.totalPrice    if (!this.totalPrice) {     return `¥${this.minPrice}起送`    } else if (diff > 0) {     return `还差¥${diff}元`    } else {     return '去结算'    } }  }

登录后复制

这样就渲染到 template 里了

 

  

 

   

 {{totalCount}} 

    

     

   

  ¥{{totalPrice}} 

  

  另需要配送费¥{{deliveryPrice}}元 

      

=minPrice}">   {{payDesc}}   

 

登录后复制

相关样式

&.active  color white  &.enough  background #00b43c  color white

登录后复制

总结:通过以上学习我们能发现,selectFoods()的变化起着关键作用,它的变化会引起DOM的变化,并最终体现到界面上,而我们不用关注DOM内部的具体实现,这就是vue的一大好处。如果采用jQuery完成这些功能会略显繁杂。

二、cartControl 组件

说明:这个组件是控制购物车小球的。其中涉及到小球的动画

(1) 新增属性 count

说明:

在goods 下的 foods 添加一个属性 count,用来存储用户选中的商品个数,计算商品总价 以及 关联徽章(显示用户选择商品的个数)的变化

方法:通过import Vue from ‘vue’;使用set接口,通过vue.set()添加属性,当它变化时就能被检测到,从而父组件能获取到count值(遍历选中的商品时使用)

methods:{ addCart(event){ // 点击count 加,  //console.log(event.target); if (!event._constructed) { // 去掉自带click事件的点击    return;   } if(!this.foodsele.count){ Vue.set(this.foodsele, 'count', 1) }else{ this.foodsele.count++ }   }, decreaseCart (event){ // 点击减少 if (!event._constructed) { // 去掉自带click事件的点击    return;    } if(this.foodsele.count){ this.foodsele.count --  }   }}

登录后复制

(2)添加按钮 实现transtion 过渡

我们要实现的效果是:当点击添加按钮时,减少按钮出现 并伴随着 旋转、平移以及透明度变化的 一些 动画效果

    

     

登录后复制

 .cart-decrease  display inline-block  padding 6px  transition: all .4s linear  /*过渡效果的 CSS 属性的名称、过渡效果需要多少时间、速度效果的速度曲线*/    .inner   line-height 24px   font-size 24px   color rgb(0,160,220)   transition all 0.4s linear  &.move-enter-active, &.move-leave-active   transform translate3d(0,0,0) /* 这样可以开启硬件加速,动画更流畅,3D旋转,X轴位移24px */   .inner       display inline-block  /* 设置成inline-block才有高度,才能有动画 */    transform rotate(0)  &.move-enter, &.move-leave-active   opacity: 0   transform translate3d(24px,0,0)   .inner    transform rotate(180deg)

登录后复制

三、抛物线小球动画

通过两个层来控制小球,外层控制一个方向的变化,内层控制另外一个方向的变化(写两层才会有抛物线的效果),采用fixed布局(是相对于视口的动画)

事件发射和接收

组件之间传值-1

组件之间传值-2

扩展

Vue1.0组件间传递

使用$on()监听事件;

使用$emit()在它上面触发事件;

使用$dispatch()派发事件,事件沿着父链冒泡;

使用$broadcast()广播事件,事件向下传导给所有的后代

(1) Vue2.0 组件之间传递数据

1-1. 当点击 添加数量时 在 cartControl 组件里的 addCount 方法里 通过 $emit 属性 派发一个事件 , 传入点击的对象

addCart(event){ // 点击count 加,//  console.log(event.target); if (!event._constructed) { // 去掉自带click事件的点击    return;   } if(!this.foodsele.count){ Vue.set(this.foodsele, 'count', 1) }else{ this.foodsele.count++ }// 当点击 添加数量时 通过 $emit 属性 提交一个名为 add 给父组件// 子组件通过 $emit触发 add事件 ,将参数传递给父组件 this.$emit('add', event.target);}

登录后复制

1-2. 操作 goods 组件

购物车组件如果提交了addCart事件就调用add函数

 

登录后复制

父组件使用 @add=”addFood”监听由子组件vm.$emit触发的事件,通过addFood()接受从子组件传递过来的数据,通知父组件数据改变了。

addFood(target) {  this._drop(target);}

登录后复制

1-3. 父组件访问子组件 vue 提供了接口 ref

复制代码 代码如下:

_drop(target) {  // 体验优化,异步执行下落动画  this.$nextTick(() => {   this.$refs.shopCart.balldrop(target);// 将target传入shopCart子组件中的balldrop方法,所以drop方法能获得用户点击按钮的元素,即能获取点击按钮的位置  });}

登录后复制

区别 访问DOM 变量

1-3. 操作 shopCart 组件

data (){ // 定义一个数组 来 控制小球的状态  定义多个对象,表示页面中做多同时运动的小球 return{ // 定义 5 个 小球   balls:[{show:false},{show:false},{show:false},{show:false},{show:false}], dropBalls:[] // 接收下落小球  }}

登录后复制

methods:{ balldrop(ele) {// console.log(el) 取到点击 对象   for(var i=0;i

动画过程开始,利用vue 提供的钩子函数


beforeEnter (el){ //找到所以设为true的小球 let count=this.balls.length while(count--){ let ball = this.balls[count]; if(ball.show){  let pos=ball.el.getBoundingClientRect() //返回元素相对于视口偏移的位置  let x=pos.left-32  // 点击的按钮与小球(fixed)之间x方向的差值  let y=-(window.innerHeight-pos.top-22)  el.style.display = '';  //设置初始位置前,手动置空,覆盖之前的display:none,使其显示       el.style.webkitTransform = `translate3d(0,${y}px,0)`; //外层元素做纵向的动画,y是变量       el.style.transform = `translate3d(0,${y}px,0)`;       let inner = el.getElementsByClassName('inner_hook')[0];//内层元素做横向动画,inner-hook(用于js选择的样式名加上-hook,表明只是用                                   //于js选择的,没有真实的样式含义)       inner.style.webkitTransform = `translate3d(${x}px,0,0)`;       inner.style.transform = `translate3d(${x}px,0,0)`; } } },   enter(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)';  }); }, afterEnter(el) {  let ball = this.dropBalls.shift(); //取到做完动画的球,再置为false,即重置,它还可以接着被利用  if (ball) {   ball.show = false;   el.style.display = 'none';  } }

登录后复制

  

       

     

    

     

登录后复制

&.drop-enter,&.drop-enter-active    transition all 0.4s cubic-bezier(0.49,-0.29,0.75,0.41)    .inner     width 16px     height 16px     border-radius 50%     background rgb(0,160,220)     transition all 0.4s linear

登录后复制

相关推荐:

Vue header组件开发实例代码

Vue组件及数据传递详解

vuejs使用递归组件实现树形目录

以上就是Vue shopCart 组件开发实例详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2788115.html

(0)
上一篇 2025年3月8日 18:22:12
下一篇 2025年3月6日 10:38:38

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js数组和对象的深浅拷贝详解

    本文主要为大家详细介绍js实现数组和对象的深浅拷贝,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望梦帮助到大家。 前提:原始数据类型和对象类型赋值时的差异 JavaScript的数据类型分为原始数据类型和对象类型。二者在内存中存放的…

    编程技术 2025年3月8日
    200
  • 实例详解react.js父子组件数据绑定实时通讯

    本文主要和大家介绍react.js 父子组件数据绑定实时通讯的示例代码,react.js我自己还在摸索学习中,碰到父子组件数据绑定实时通讯的问题,研究了一下,分享给大家,也给自己留个笔记: import React,{Component} …

    编程技术 2025年3月8日
    200
  • Map以及常用api实例详解

    ecmascript 6中的map类型是一种存储着许多键值对的有序列表。键值对支持所有的数据类型. 键 0 和 ‘0’会被当做两个不同的键,不会发生强制类型转换.本文主要为大家带来一篇es6系列教程_ map详解以及常用api介…

    2025年3月8日
    200
  • webuploader文件上传组件的开发实例

    最近项目中需要用到百度的webuploader大文件的分片上传,对接后端的fastdfs,于是着手写了这个文件上传的小插件,步骤很简单,但是其中猜到的坑也不少,本文主要介绍了vue webuploader 文件上传组件开发,小编觉得挺不错的…

    2025年3月8日
    200
  • JS中的BOM应用详解

    本文我们住要和大家分享js中的bom应用详解,我们曾经讲过js由三部分组成,其中一个部分就是bom,用于对浏览器进行操作。这节课我们主要就来介绍bom。 BOM基础 我们先来看一个BOM的最基础功能:打开、关闭窗口: 无标题文档 登录后复制…

    2025年3月8日
    200
  • React16.2的fiber架构详解

    本文主要和大家分享react16.2的fiber架构详解,希望能帮助到大家。insertupdateintofiber 会根据fiber的状态创建一个或两个列队对象,对象是长成这样的对象是长成这样的 //by 司徒正美, 加群:370262…

    2025年3月8日 编程技术
    200
  • js面向对象之继承知识详解

    说到这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名);一种是实现继承(继承实际的方法)本文主要和大家介绍js面向对象之继承的相关知识,以及分享了读者弄明白这个知识点的学习心得,…

    2025年3月8日
    200
  • vue之v-if和v-show的区别详解

    本文主要和大家介绍vue学习笔记之v-if和v-show的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 v-if vs v-show v-if 是“真正的”条件渲染,因为它会确保在切换…

    2025年3月8日
    200
  • jQuery UI日期选择器实例详解

    默认功能 日期选择器(Datepicker)绑定到一个标准的表单 input 字段上。把焦点移到 input 上(点击或者使用 tab 键),在一个小的覆盖层上打开一个交互日历。选择一个日期,点击页面上的任意地方(输入框即失去焦点),或者点…

    编程技术 2025年3月8日
    200
  • js的变量提升和函数提升详解

    本文为大家带来一篇基于js的变量提升和函数提升(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。 一、变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论