vue实例之组件开发:购物车实现

效果图

文件目录

Index.vue:

<template>
  <div class="shopping">
    <Header />
    <Item
      v-for="item in items"
      :key="item.id"
      :item="item"
      @change-number="changeNumber"
    />
    <Footer :items="items" />
  </div>
</template>

<script>
import Header from "./Header";
import Item from "./Item";
import Footer from "./Footer";
export default {
  data() {
    return {
      items: [
        {
          id: 0,
          name: "TCL彩电",
          number: 1,
          price: 100
        },
        {
          id: 1,
          name: "机顶盒",
          number: 1,
          price: 200
        },
        {
          id: 2,
          name: "海尔冰箱",
          number: 2,
          price: 100
        },
        {
          id: 3,
          name: "小米手机",
          number: 1,
          price: 100
        },
        {
          id: 4,
          name: "PPTV电视",
          number: 1,
          price: 100
        }
      ]
    };
  },
  methods: {
    changeNumber(data) {
      const { id, type } = data;
      this.items.some((item, index) => {
        if (item.id === id) {
          if (type === "change") {
            item.number = Number(data.number);
          } else if (type === "add") {
            ++item.number;
          } else if (type === "reduce" && item.number > 0) {
            --item.number;
          } else if (type === "delete") {
            this.items.splice(index, 1);
          }

          return true;
        }
      });
    }
  },
  components: {
    Header,
    Item,
    Footer
  }
};
</script>

<style scoped>
</style>

Header.vue:

<template>
  <div class="header">
    <h1>张三的商品</h1>
  </div>
</template>

<script>
export default {
    
}
</script>

<style scoped>
.header h1{
    background: #0000FF;
    color: #FFF;
    margin: 0;
}
</style>

Item.vue:

<template>
  <div class="item">
    <span class="name">{{item.name}}</span>
    <span class="operation">
      <button @click="reduceNumber">-</button>
      <input :value="item.number" @change="changeNumber" />
      <button @click="addNumber">+</button>
      <button @click="deleteProduct">x</button>
    </span>
  </div>
</template>

<script>
export default {
  props: ["item"],
  methods: {
    reduceNumber() {
      this.$emit("change-number", {
        id: this.item.id,
        type: "reduce"
      });
    },
    changeNumber(e) {
      this.$emit("change-number", {
        id: this.item.id,
        number: e.target.value,
        type: "change"
      });
    },
    addNumber() {
      this.$emit("change-number", {
        id: this.item.id,
        type: "add"
      });
    },
    deleteProduct() {
      this.$emit("change-number", {
        id: this.item.id,
        type: "delete"
      });
    }
  }
};
</script>

<style scoped>
.item {
  border-bottom: 1px solid #000;
  display: flex;
  align-items: center;
  padding-top: 5px;
  padding-bottom: 5px;
  justify-content: space-between;
}
</style>

Footer.vue:

<template>
  <div class="footer">
    总价:{{sum}}
    <button>结算</button>
  </div>
</template>

<script>
export default {
  props: ["items"],
  computed: {
    sum() {
      let total = 0;
      this.items.forEach(value => {
        total += value.number * value.price;
      });
      return total;
    }
  }
};
</script>

<style scoped>
.footer {
  padding-top: 5px;
  padding-bottom: 5px;
  background: #ffff00;
  color: #ff0000;
  text-align: right;
}

.footer button {
  border: 0;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 10px;
  padding-right: 10px;
  background: #ff0000;
  color: #fff;
  cursor: pointer;
}
</style>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值