vue3使用table编写购物车案例(watch,computed)

71 阅读1分钟

代码示例

<template>
  <div id="app">
    <p>表单数据</p>
    <table>
      <thead>
        <tr>
          <td>
            <input type="checkbox" v-model="data.selected" />
          </td>
          <td>商品</td>
          <td>单价</td>
          <td>存库</td>
          <td colspan="2">操作</td>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(value, index) in data.list">
          <td>
            <input type="checkbox" v-model="data.checkboxList" :value="value" />
          </td>
          <td>{{ value.name }}</td>
          <td>{{ value.price }}</td>
          <td>{{ value.stock }}</td>
          <td>
            <button @click="sub(value)">-</button>
            {{ value.number }}
            <button @click="add(value)">+</button>
          </td>
          <td><button @click="del(index, value.id)">删除</button></td>
        </tr>
      </tbody>
      <tfoot>
        <tr>
          <td>总价{{ totalPrice }}</td>
        </tr>
      </tfoot>
    </table>
  </div>
</template>

<script setup>
import { computed, reactive, watch } from "vue";

const data = reactive({
  selected: false,
  checkboxList: [],
  list: [
    {
      id: 1,
      name: "铅笔",
      price: 10,
      number: 1,
      stock: 3,
    },
    {
      id: 2,
      name: "鼠标",
      price: 20,
      number: 2,
      stock: 5,
    },
    {
      id: 3,
      name: "键盘",
      price: 30,
      number: 1,
      stock: 6,
    },
  ],
});

const sub = (value) => {
  value.number--;
  if (value.number < 1) {
    value.number = 1;
  }
};
const add = (value) => {
  value.number++;
  if (value.number > value.stock) {
    value.number = value.stock;
  }
};
const del = (index, id) => {
  data.list.splice(index, 1);
  console.log("ss", data);
  let newArr = data.checkboxList.filter((value, index) => {
    return value.id !== id;
  });
  data.checkboxList = newArr;
  checkSelect();
};

let flag = true;

watch(
  () => data.selected,
  (newValue, oldValue) => {
    console.log("newValue:", newValue);
    console.log("oldValue:", oldValue);
    if (newValue) {
      data.checkboxList = data.list;
    } else {
      if (flag) {
        data.checkboxList = [];
      }
    }
  }
);

watch(
  () => data.checkboxList,
  (newValue, oldValue) => {
    if (
      data.checkboxList.length === data.list.length &&
      data.list.length !== 0
    ) {
      data.selected = true;
      flag = true;
    } else {
      data.selected = false;
      flag = false;
    }
  }
);

const totalPrice = computed(() => {
  return data.checkboxList.reduce(
    (total, item) => total + item.price * item.number,
    0
  );
});
</script>

<style scoped></style>