vue制作水果购物车

需要实现以下功能:

1、基本渲染

2、删除和修改数量

3、全选反选

4、统计选中的总价和总数量

5、持久化到本地

一、基本渲染(省略)

data:

data: {
  // 水果列表
  fruitList: [
    {
      id: 1,
      icon: 'http://autumnfish.cn/static/火龙果.png',
      isChecked: true,
      num: 2,
      price: 6,
    },
    {
      id: 2,
      icon: 'http://autumnfish.cn/static/荔枝.png',
      isChecked: false,
      num: 7,
      price: 20,
    },
    {
      id: 3,
      icon: 'http://autumnfish.cn/static/榴莲.png',
      isChecked: false,
      num: 3,
      price: 40,
    },
    {
      id: 4,
      icon: 'http://autumnfish.cn/static/鸭梨.png',
      isChecked: true,
      num: 10,
      price: 3,
    },
    {
      id: 5,
      icon: 'http://autumnfish.cn/static/樱桃.png',
      isChecked: false,
      num: 20,
      price: 34,
    },
  ],
},

二、删除和修改数量

删除:在删除按钮中添加点击事件,传入id

<button @click="del(item.id)">删除</button>

methods中写入方法:

del (id) {
  this.fruitList = this.fruitList.filter(item => item.id !== id)
      },

数量加减:在加减按钮中添加点击事件,通过id对数组中的num进行增减

当数量<=1时,减号被禁止使用

<button :disabled="item.num <= 1" class="decrease" @click="sub(item.id)"> - </button>
<span class="my-input__inner">{{ item.num }}</span>
<button class="increase" @click="add(item.id)"> + </button>

methods中写入方法:

add(id) {
  // 1. 根据 id 找到数组中的对应项 → find
  const fruit = this.fruitList.find(item => item.id === id)
  // 2. 操作 num 数量
  fruit.num++
},
sub(id) {
  // 1. 根据 id 找到数组中的对应项 → find
  const fruit = this.fruitList.find(item => item.id === id)
  // 2. 操作 num 数量
  fruit.num--
}

三、全选反选

在全选框先使用v-model=“isAll”进项关联,在computed中写入代码isAll,实现全选反选功能

isAll: {
  get() {
    // 必须所有的小选项都选中,全选按钮才选中 every
    return this.fruitList.every(item => item.isChecked);
  },
//  基于拿到的布尔值,让小选框同步状态
  set(value) {
    this.fruitList.forEach(item => item.isChecked = value)
  }
}

四、总数和总价:

 在computed中写入计算方法:

对以及勾选的商品进行计算,需要判断isChecked的布尔值

totalCount() {
  return this.fruitList.reduce((sum, item) => {
    // 计算选中的总数
    if (item.isChecked) {
      return sum + item.num;
    } else {
      return sum
    }
  }, 0);
},
totalPrice() {
  // 计算选中的总价
  return this.fruitList.reduce((sum, item) => {
    if (item.isChecked) {
      return (sum + item.num) * item.price;
    } else {
      return sum
    }
  }, 0);
}

五、持久化到本地

在watch监听器中写入代码,将数据转为字符串存入本地存储 

watch: {
  fruitList: {
    deep: true,
    handler(newValue) {
      // 将变化后的newValue存入本地 (转JSON)
      localStorage.setItem('list', JSON.stringify(newValue));
    }
  }
}

 接收本地存储数据并转为对象去使用,当字符串为空时,使用原始数据defaultArr字符串

data: {
    // 水果列表
    // 将数据持久化本地,当list被清除显示默认list
    fruitList: JSON.parse(localStorage.getItem('list')) || defaultArr,
      },

defaultArr字符串:

const defaultArr = [
  {
    id: 1,
    icon: 'http://autumnfish.cn/static/火龙果.png',
    isChecked: true,
    num: 2,
    price: 6,
  },
  {
    id: 2,
    icon: 'http://autumnfish.cn/static/荔枝.png',
    isChecked: false,
    num: 7,
    price: 20,
  },
  {
    id: 3,
    icon: 'http://autumnfish.cn/static/榴莲.png',
    isChecked: false,
    num: 3,
    price: 40,
  },
  {
    id: 4,
    icon: 'http://autumnfish.cn/static/鸭梨.png',
    isChecked: true,
    num: 10,
    price: 3,
  },
  {
    id: 5,
    icon: 'http://autumnfish.cn/static/樱桃.png',
    isChecked: false,
    num: 20,
    price: 34,
  },
]

实现效果:

 

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值