博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue实现购物车功能
阅读量:4948 次
发布时间:2019-06-11

本文共 7202 字,大约阅读时间需要 24 分钟。

vue是前端轻量级MVVM框架,入门门槛相对较低,今天用Vue做一个购物车实例,发表以便记录

原理分析和实现

首先,还是先把布局写好,和引入vue,准备vue实例,这个不多说,代码如下

    
Title

购物清单

全选
商品
数量
单价(元)
金额(元)
操作
【斯文】甘油 | 丙三醇

品牌:韩国skc  产地:韩国

规格/纯度:99.7%  起定量:215千克

配送仓储:上海仓海仓储

800.00

800.00

删除
【斯文】甘油 | 丙三醇

品牌:韩国skc  产地:韩国

规格/纯度:99.7%  起定量:215千克

配送仓储:上海仓海仓储

800.00

800.00

删除
删除所选商品
继续购物
去结算

1600

2件商品总计(不含运费):

然后准备下列表数据,根据下面表格的箭头

productList:[    {        'pro_name': '【斯文】甘油 | 丙三醇',//产品名称        'pro_brand': 'skc',//品牌名称        'pro_place': '韩国',//产地        'pro_purity': '99.7%',//规格        'pro_min': "215千克",//最小起订量        'pro_depot': '上海仓海仓储',//所在仓库        'pro_num': 3,//数量        'pro_img': '../../images/ucenter/testimg.jpg',//图片链接        'pro_price': 800//单价    }]

准备了这么多,大家可能想到,还缺少一个,就是记录产品是否有选中,但是这个字段,虽然可以在上面那里加,但是意义不大,比如在平常项目那里!后台的数据不会这样返回,数据库也不会有这个字段,这个字段应该是自己添加的。代码如下

new Vue({    el:'#shopping-cart',    data:{        productList:[            {                'pro_name': '【斯文】甘油 | 丙三醇',//产品名称                'pro_brand': 'skc',//品牌名称                'pro_place': '韩国',//产地                'pro_purity': '99.7%',//规格                'pro_min': "215千克",//最小起订量                'pro_depot': '上海仓海仓储',//所在仓库                'pro_num': 3,//数量                'pro_img': '../../images/ucenter/testimg.jpg',//图片链接                'pro_price': 800//单价            }        ]    },    computed: {},    methods:{    },    mounted:function () {        //为productList添加select(是否选中)字段,初始值为true        var _this=this;        //为productList添加select(是否选中)字段,初始值为true        this.productList.map(function (item) {            _this.$set(item, 'select', true);        })        //要像上面这样写双向绑定才能起效,下面的写法是有问题的,双向绑定不起效的!        //this.productList.map(function (item) {item.select=true})    }})

步骤一、点击增加和减少按钮(箭头指向地方),所属列的金额改变(红框地方)要先把列表的数据给铺出来。利用v-for指令。代码如下

                
{
{item.pro_name}}

品牌:{

{item.pro_brand}}  产地:{
{item.pro_place}}

规格/纯度:{

{item.pro_purity}}  起定量:{
{item.pro_min}}

配送仓储:{

{item.pro_depot}}

{

{item.pro_price.toFixed(2)}}

{

{item.pro_price*item.pro_num}}.00

删除

这两个按钮的功能已经实现了,后面的金额也会发生变化!是不是感到很惊喜!其实这里没什么特别的,就是因为输入框利用v-model绑定了数量(pro_num),然后两个按钮分别添加了事件@click="item.pro_num--"和@click="item.pro_num++"

 

步骤2

点击所属列选择按钮(箭头指向地方),总计的金额(红框地方)和已选产品的列数(蓝框地方)和全选(黄框地方)会改变(如果已经全选了,全选按钮自动变成全选,如果没有全选,全选按钮,自动取消全选)!

首先,选择与取消选择,在这里只有两个操作(其实只有一个:改变这条记录的select字段)。

 

 

 

 

其实就是等于添加了@click="item.select=!item.select" :class="{'check-true':item.select}"这里。点击这个,这条数据的select字段就取反(true->false或者false->true)。然后:class="{'check-true':item.select}",就会根据这条数据的select字段进行判断,是否添加check-true类名,如果select字段为true,就添加类名

 

全选按钮:

  这里用一个computed(计算属性)就好。

html

全选

js

computed: {    isSelectAll:function(){        //如果productList中每一条数据的select都为true,返回true,否则返回false;        return this.productList.every(function (val) { return val.select});    }}

就是计算属性中,定义的isSelectAll依赖productList。只要productList改变,isSelectAll的返回值就会改变,然后:class="{'check-true':isSelectAll}"根绝isSelectAll返回值是否添加'check-true'类名,显示对应的样式!

 

这里的多少件产品和总价,也是使用计算属性

html

{

{getTotal.totalPrice}}

{

{getTotal.totalNum}}件商品总计(不含运费):

js

computed: {    //检测是否全选    isSelectAll:function(){        //如果productList中每一条数据的select都为true,返回true,否则返回false;        return this.productList.every(function (val) { return val.select});    },    //获取总价和产品总件数    getTotal:function(){        //获取productList中select为true的数据。        var _proList=this.productList.filter(function (val) { return val.select}),totalPrice=0;        for(var i=0,len=_proList.length;i

 

 

步骤3

点击全选按钮(箭头指向部分),会自动的对产品进行全选或者取消全选,下面的总计也会发生改变

做到这一步,大家应该知道,全选或者取消全选,就是改变记录的select。但是怎么知道现在的列表有没有全选呢?这个很贱,不需要在操作函数(全选与取消全选函数)里面遍历,大家应该还记得第二步的计算属性isSelectAll(为true就是全选,否则不是全选),把这个传进操作函数就好,然后操作函数,根据参数,决定执行全选,还是取消全选操作。代码如下!

html

全选

js

methods: {    //全选与取消全选    selectProduct:function(_isSelect){        //遍历productList,全部取反        for (var i = 0, len = this.productList.length; i < len; i++) {            this.productList[i].select = !_isSelect;        }    }},

 

 

步骤4

点击删除产品,会删除已经选中的,全选按钮和下面的总计,都会变化!点击每条记录后面的删除,会删除当前的这条记录。全选按钮和下面的总计,也都会变化!

 

首先,点击删除产品,删除已经选中。这个大家知道了怎么做了!就是遍历productList,如果哪条记录的select为true,就删除。

然后,点击每条记录后面的删除,删除当前的这条记录。这个在html遍历productList的时候。顺便带上索引,然后把索引当成参数,传进操作函数,然后根据索引参数,删除productList的哪一条记录。即可实现!代码如下!
html

{
{item.pro_name}}

品牌:{

{item.pro_brand}}  产地:{
{item.pro_place}}

规格/纯度:{

{item.pro_purity}}  起定量:{
{item.pro_min}}

配送仓储:{

{item.pro_depot}}

{

{item.pro_price.toFixed(2)}}

{

{item.pro_price*item.pro_num}}.00

删除...删除所选商品

js

//删除已经选中(select=true)的产品deleteProduct:function () {    this.productList=this.productList.filter(function (item) {
return !item.select})},//删除单条产品deleteOneProduct:function (index) { //根据索引删除productList的记录 this.productList.splice(index,1);},

 

按钮图片:

 

完整代码

购物清单

全选
商品
数量
单价(元)
金额(元)
操作
{ {item.pro_name}}

品牌:{ {item.pro_brand}}  { {item.pro_place}}

规格/纯度:{ {item.pro_purity}}  起定量:{ {item.pro_min}}

配送仓储:{ {item.pro_depot}}

{ {item.pro_price.toFixed(2)}}.00

{ {item.pro_price*item.pro_num}}.00

删除

 

 

 

转自:https://segmentfault.com/a/1190000010801357#articleHeader6 (守候)

 

转载于:https://www.cnblogs.com/luna666/p/9805647.html

你可能感兴趣的文章
nc6.5(二开) 修改元数据后,单据单据追溯不了
查看>>
随机数(不重复)
查看>>
php优化,操作码优化,缓存优化
查看>>
NYOJ-14 会场安排问题 -----贪心
查看>>
Docker进阶之八:搭建LNMP网站平台实战
查看>>
常用的 Python 标准库都有哪些?
查看>>
新手学PHP必看
查看>>
收藏收藏,赶紧的。
查看>>
java中的基本算法
查看>>
appium安装
查看>>
List指定字段赋特定值(非循环) asp.net
查看>>
linux中批量改名
查看>>
2个浏览器窗口间通信
查看>>
docker (centOS 7) 使用笔记3 - 修改docker默认的虚拟网址
查看>>
136. Single Number (Bit)
查看>>
win10环境下mysql5.7压缩包解压安装过程
查看>>
hud 2586 How far away ?
查看>>
JNI NewString
查看>>
QTP日期控件
查看>>
Linux:Ubuntu 14.04 Server 离线安装Jjava8(及在线安装)
查看>>