vue实现商城购物车功能

本文实例为大家分享了vue实现商城购物车功能的具体代码,供大家参考,具体内容如下

首先,先上最终的效果图

效果并不是很好看,但是这不是重点。

首先,我们先看下布局:

<template>
  <div class="shopcar" id="demo04">
    <div class="header-title">
      <h3>购物车</h3>
    </div>
    <div class="car-list">
      <ul>
        <li class="car-item" v-for="(item,index) in good_list">
          <div class="input-block">
            <label class="input-label" :class="{active: item.is_selected}" :for="'car-checkbox-'+index" @click="select_one(index)"></label>
          </div>
          <div class="car-item-content">
            <div class="car-img">
              <img :src="item.img" />
            </div>
            <div class="car-cont">
              <h3>{{item.title}}</h3>
              <div class="cat-desc">
                <span v-for="spec in item.spec_item">{{spec}}</span>
              </div>
            </div>
            <div class="num">
              <span @click="reduce(index)">-</span>
              <span>{{item.num}}</span>
              <span @click="add(index)">+</span>
            </div>
            <div class="car-price">
              <span class="car-price">¥{{item.price}}</span>
              <span class="car-num">X{{item.num}}</span>
            </div>
          </div>
        </li>
      </ul>
    </div>
    <div class="car-footer">
      <div class="foot-car">
        <label for="foot-check" class="input-label" :class="{active: selected_all}" @click="slect_all"></label>
      </div>
      <div class="total-cont">
        <span>总价:{{totalPrice}}</span>
        <span>共{{totalNum}}件</span>
      </div>
      <div class="btn-box">
        <button>立即下单</button>
      </div>
    </div>
  </div>
</template>

非常常见的布局,微商城购物车随处可见,先说明下,在这里,实现选中的功能并不是用传统的label+checkbox实现,而是一个单独的label,目的是为了简化dom结构,在传统的jq项目或者zepto项目中,一般会会这样写,主要是为了方便操作demo,但是vue项目完全不用考虑dom的操作,怎么方便怎么来就ok。

在加些简单的样式,

  .header-title
    height 42px
    line-height 42px
    background #f5f5f5
    border-bottom 1px solid #ddd
  .header-title h3
    font-weight normal
    text-align center
  .car-list
    background #f2f2f2
    margin-top 12px
    padding 8px
  .car-item
    border-bottom 1px solid #ddd
    position relative
    height 76px
    overflow hidden
  .car-checkbox
    display none
  .input-block
    width 30px
    float left
    height 55px
    line-height 55px
  .input-label
    cursor pointer
    position absolute
    width 18px
    height 18px
    top 18px
    left 0
    background #fff
    border:2px solid #ccc
    border-radius 50%
  .input-label:after
    opacity 0
    content ''
    position absolute
    width 9px
    height 5px
    background transparent
    top 6px
    left 6px
    border 2px solid #333
    border-top none
    border-right none
    -webkit-transform rotate(-45deg)
    -moz-transform rotate(-45deg)
    -o-transform rotate(-45deg)
    -ms-transform rotate(-45deg)
    transform rotate(-45deg)
  .car-img
    width 64px
    height 64px
    float left
    overflow hidden
  .car-img img
    width 100%
  .input-label.active
    background #F15A24
  .car-cont
    margin-left 100px
  .car-cont h3
    font-weight normal
    line-height 24px
    font-size 14px
  .car-price
    position absolute
    right 12px
    bottom 0px
    width 40px
    height 40px
    text-align right
  .car-price span
    display block
    height 24px
    line-height 24px
    width 100%
  .car-footer
    height 60px
    background #f5f5f5
    position fixed
    bottom 0
    left 0
    right 0
  .foot-car
    width 42px
    height 60px
    float left
    margin-left 12px
    position relative
  .total-cont
    height 60px
    line-height 60px
    font-size 16px
    float left
  .total-cont span
    display inline-block
    margin-left 12px
  .btn-box
    float right
    height 60px
    line-height 60px
  .btn-box button
    height 100%
    width: 100px
    border none
    background #F15A24
    color #fff
    font-size 16px
  .num
    position absolute
    top 28px
    right 25px
    width 120px
  .num span
    display inline-block
    width 28px
    height 28px
    float left
    text-align center
    line-height 28px
    border 1px solid #ddd
    font-size 14px

最近在学习stylus的使用,所以,就当做练习了。
接下就是javascript了。

export default {
    data () {
      return {
        good_list: [
          {
            title: 'Apple iPhone 6s 16GB 玫瑰金色 移动联通电信4G手机',
            img: "http://sc.tywebs.cn/public/upload/goods/2017/04-27/a767693b9a84747f25335f0e33d3d380.jpg",
            num: 2,
            price: 6070.00,
            spec_item:[
              '内存:16G',
              '网络:4G',
              '颜色:玫瑰金'
            ],
            is_selected: false
          },{
            title: 'Apple iPhone 6s 32GB 玫瑰金色 移动联通电信4G手机',
            img: 'http://sc.tywebs.cn/public/upload/goods/2017/04-27/a767693b9a84747f25335f0e33d3d380.jpg',
            num: 2,
            price: 4570.00,
            spec_item:[
              '内存:32G',
              '网络:4G',
              '颜色:玫瑰金'
            ],
            is_selected: true
          },{
            title: 'Apple iPhone 6s 8GB 玫瑰金色 移动联通电信4G手机',
            img: 'http://sc.tywebs.cn/public/upload/goods/2017/04-27/a767693b9a84747f25335f0e33d3d380.jpg',
            num: 2,
            price: 4870.00,
            spec_item:[
              '内存:8G',
              '网络:4G',
              '颜色:玫瑰金'
            ],
            is_selected: false
          },{
            title: 'Apple iPhone 6s 128GB 玫瑰金色 移动联通电信4G手机',
            img: 'http://sc.tywebs.cn/public/upload/goods/2017/04-27/a767693b9a84747f25335f0e33d3d380.jpg',
            num: 2,
            price: 10568.00,
            spec_item:[
              '内存:128G',
              '网络:4G',
              '颜色:玫瑰金'
            ],
            is_selected: true
          },
        ],
        totalPrice: 0,
        totalNum: 0,
        selected_all: false
      }
    },
    mounted: function () {
      this.getTotal();
    },
    watch: {
      'good_list': {
        handler: function (val, oldVal) {
          // console.log(val)
          return val;
        },
        deep: true
      }
    },
    methods: {
      getTotal () {
        this.totalPrice = 0
        this.totalNum = 0
        for (var i = 0; i < this.good_list.length; i++) {
          var _d = this.good_list[i]
          if(_d.is_selected){
            this.totalPrice += _d['price'] * _d['num']
            this.totalNum +=_d['num']
          }
        }
      },
      select_one (index) {
        if(this.good_list[index].is_selected == true){
          this.good_list[index].is_selected = false
        }else{
          this.good_list[index].is_selected = true
        }
        this.getTotal()
      },
      slect_all () {
        if(this.selected_all){
          for (var i = 0; i < this.good_list.length; i++) {
            this.good_list[i].is_selected = false;
          }
          this.selected_all = false
        }else{
          for (var i = 0; i < this.good_list.length; i++) {
            this.good_list[i].is_selected = true;
          }
          this.selected_all = true
        }
        this.getTotal()
      },
      reduce (index) {
        if(this.good_list[index].num <= 1) return;
        this.good_list[index].num --
        this.getTotal()
      },
      add (index) {
        this.good_list[index].num ++
        this.getTotal()
      }
    }
  }

这里用mock数据来代替后台请求数据的动作,为了方便测试,逻辑比较简单,首先getTotal这个方法用来计算选中的item的数量以及总价,select_one用来处理单个选中的逻辑,slect_all 用来处理全部选中以及全部取消选中的操作,reduce用来处理处理减操作,顾名思义add用来处理加的操作。当然在真实的开发中,还会有校验库存的动作,每次加减都要校验库存。数据处理也会更复杂,但是闻琴弦而知雅意,器原理都是相通的。

github地址传送门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Vue2.0实现购物车功能

    简介 vue.js是由华人尤雨溪开发的一套MVVM框架.vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统,它非常适用于具有复杂交互逻辑的前端应用,如一些单页应用程序,有很多表单操作,页面中的内容需要根据用户的操作动态变化. 主要特性: 1.响应式的数据绑定  2.组件化开发  3.Virtual DOM 开发准备 工具 我使用的编辑器是sublime text3,首先要先安装个插件sublimeServer,用来搭建一个http服务器,使用详情请查看这篇博

  • Vue实现购物车场景下的应用

    本文实例为大家分享了Vue在购物车场景下的应用,供大家参考,具体内容如下 购物车场景需求: 1. 商品.店铺.购物车的选择 2. 商品删除 关键代码 测试数据 var _list = [{ checked: false, goods: [{ name: "商品1", price: 23, checked: false }] }, { checked: false, goods: [{ name: "商品2", price: 20, checked: false },

  • Vue.js搭建移动端购物车界面

    本文介绍了如何使用Vue搭建一个移动端购物车界面,最终实现的功能包括: 1. 选择要最终购买的物品 2. 选择每件物品购买的数量 3.  实时更新所选择物品的总价格 HTML部分 首先给出HTML部分代码和注释,显示了整个界面的结构. <body> <div class="checkout"> <div id="app"> <div class="container"> <div class=

  • Vuejs实现购物车功能

    开始更新前端框架Vue.JS的相关博客. 功能概述 学习了Vue.JS的一些基础知识,现在利用指令.数据绑定这些基础知识开发一个简单的购物车功能.功能要点如下: (1)展示商品的名称.单价和数量: (2)商品的数量可以增加和减少: (3)购物车的总价要实时更新,即数量发生变动,总价也要相应的改变: (4)商品可以从购物车中移除: (5)具有选择功能,只计算选中的商品的总价. 上一张截图,如下: 代码 代码分成三部分,分别是HTML.JS.CSS.关键的是HTML和JS. HTML <!DOCTY

  • vue实现商城上货组件简易版

    本文实例为大家分享了vue实现商城上货组件的具体代码,供大家参考,具体内容如下 0.结果放前面 点击查看效果 带脚手架的源码 加个Star后,fork下来. 然后在控制台,先输入npm install安装依赖,再输入npm run dev运行查看效果 1.先列需求 一切开发都是基于需求做的,所以需求先行,根据需求设计功能. 需求如下: 上货商品有多个属性类别:(例如:颜色.尺寸.型号) 每个类别有多个子属性:(例如:白色.绿色.金色) 每个商品必然具备每个类别的其中一个子属性: 除此之外还有额外

  • vuejs手把手教你写一个完整的购物车实例代码

    由于我们公司是主营业务是海淘,所以每个项目都是类似淘宝天猫之类的商城,那么购物车就是一个重点开发功能模块.介于之前我都是用jq来写购物车的,这次就用vuejs来写一个购物车.下面我就从全选,数量控制器,运费,商品金额计算等方法来演示一下一个能用在实际场景的购物车是怎么做出来的以及记录一下这次用vuejs踩过的坑. 1.一层数据结构-全选 下面这段代码和vuejs官网里面checkbox绑定很像.不明白的可以直接上vuejs官网看看. <!DOCTYPE html> <html lang=

  • vue购物车插件编写代码

    本文实例为大家分享了vue购物车插件的具体代码,供大家参考,具体内容如下 先上效果图 下面相关代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello MUI</title> <meta name="viewport" content="width=device-width, initial-sca

  • 用vue和node写的简易购物车实现

    项目介绍 这是用vue写前端,用node来接收前端发来的请求,然后进行相应的数据操作,例如数据的存取和删除等.这是个人的练习项目,目前功能做的比较简单,主要是展示商品列表,把商品加入购物车,从购物车删除商品三个小功能. 搭建本地环境 因为是用vue,需要用babel把es6语法转为es5语法. 1.配置.babelrc文件 { "presets": [ "es2015", "stage-2" ], "plugins": [&q

  • Vue实现购物车功能

    效果图: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.0.2/css/bootstrap.min.css" rel="external nofollow" /> &l

  • 基于Vuejs实现购物车功能

    本文实例为大家分享了Vuejs购物车实现代码,供大家参考,具体内容如下 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>我的vue购物车</title> <link rel="stylesheet" href="css/bootstrap.min.css&q

随机推荐