Skip to content

购物车练习代码

此处个人更建议使用一个计算属性来计算出 finalGoods(选中的商品),使用 finalGoods 来进行一系列的操作,比如批量删除和结算的时候用得到

vue
<template>
  <div id="app">
    <div id="shoppingcart">
      <table>
        <!-- 第一行 标题行 -->
        <tr>
          <td>
            <input type="checkbox" v-model="isCheckedAll" />
            全选
          </td>
          <td>商品</td>
          <td>单价(元)</td>
          <td>数量</td>
          <td>小记(元)</td>
          <td>操作</td>
        </tr>
        <!-- 第二行开始需要使用循环来渲染 -->
        <tr v-for="item in goods" :key="item.id">
          <td><input type="checkbox" v-model="item.checked" /></td>
          <td>{{ item.goods_name }}</td>
          <td>{{ item.goods_price }}</td>
          <td>
            <button @click="item.goods_num > 0 ? item.goods_num-- : ''">
              -
            </button>
            <input type="text" v-model="item.goods_num" class="ipt" />
            <button @click="item.goods_num++">+</button>
          </td>
          <td>{{ item.goods_num * item.goods_price }}</td>
          <td>
            <button class="danger" @click="deleteItem(item.id)">删除</button>
          </td>
        </tr>
      </table>
      <!-- footer部分 -->
      <footer class="footer">
        <div class="footer-left">
          <input type="checkbox" v-model="isCheckedAll" />
          <span>全选</span>
          <a @click="deleteChecked">删除选中的商品</a>
          <span>共{{ goods.length }}件商品,已选择{{ checkedLength }}件</span>
        </div>
        <div class="footer-right">
          <div>
            合计(不含运费): <span>¥ {{ totalPrice }}</span>
          </div>
          <button>去结算</button>
        </div>
      </footer>
    </div>
  </div>
</template>

<script setup>
import { ref, computed } from "vue";
// 要渲染的数据
const goods = ref([
  {
    id: 1,
    goods_name: "华为手环",
    goods_price: 169,
    goods_num: 1,
    checked: true,
  },
  {
    id: 2,
    goods_name: "索尼耳机",
    goods_price: 163,
    goods_num: 1,
    checked: true,
  },
  {
    id: 3,
    goods_name: "小米汽车",
    goods_price: 1890,
    goods_num: 1,
    checked: false,
  },
  {
    id: 4,
    goods_name: "iPhone14",
    goods_price: 1699,
    goods_num: 1,
    checked: true,
  },
]);

// 方法
// 根据 id 删除某一个项目
function deleteItem(id) {
  if (window.confirm("确定要删除该商品吗?"))
    goods.value = goods.value.filter((item) => {
      return item.id !== id;
    });
}
// 删除选中的项目
function deleteChecked() {
  if (window.confirm("确定要删除勾选的商品吗?"))
    goods.value = goods.value.filter((item) => {
      return !item.checked;
    });
}

// 计算属性
// 计算商品总价
const totalPrice = computed(() => {
  let total = 0;
  for (let item of goods.value) {
    if (item.checked) {
      total += item.goods_num * item.goods_price;
    }
  }
  return total;
});
// 计算选中的商品个数
const checkedLength = computed(() => {
  return goods.value.filter((item) => {
    return item.checked;
  }).length;
});
// 全选所有的商品
const isCheckedAll = computed({
  get() {
    return goods.value.every((item) => {
      return item.checked;
    });
  },
  set(newValue) {
    goods.value.forEach((item) => {
      item.checked = newValue;
    });
  },
});
</script>

<style scoped>
@import "./assets/shopping-cart.css";
</style>

MIT License