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

news/2024/7/10 1:38:05 标签: 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>


http://www.niftyadmin.cn/n/886777.html

相关文章

vue实例:实现数据的增删改查(纯前端)

<template><div class"container"><div class"input-bar"><table><tbody><td>标题&#xff1a;</td><td><input type"text" v-model"addObj.title"/></td><td>发布…

GO语言的defer 关键字

介绍 Go 语言的 defer 会在当前函数返回前执行传入的函数&#xff0c;它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 作为一个编程语言中的关键字&#xff0c;defer 的实现一定是由编译器和运行时共同完成的&#xff0c;不过在深入源码分析它的实现之前我们还…

加载状态的实现

.shade {position: fixed;top: 0;left: 0;height: 100%;width: 100%;background: #FFFFFF;z-index:99999;filter:alpha(opacity100); /* IE */-moz-opacity: 1; /* Moz FF */opacity: 1; /* 支持CSS3的浏览器&#xff08;FF 1.5也支持&#xff09;*/display: none; }.shade ta…

React类的自定义原型方法中的this指向为什么是undefined?如何解决?(绑定 this 的几种方式)

首先来看下类中定义的原型方法的this不同调用时的指向&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

React中数据子传父的实现

原理&#xff1a;通过props将父组件中的方法传给子组件实现。 父组件&#xff1a; class Parent extends React.Component{constructor(){super();this.state{count: 0}}increase(e){this.setState({count: this.state.counte})}render(){return (<div><p onClick{…

什么是Library

在计算机科学中&#xff0c;library是计算机程序经常用于软件开发的非易失性资源的集合。这些可能包括配置数据&#xff0c;文档&#xff0c;帮助数据&#xff0c;消息模板&#xff0c;预编写的代码和子例程&#xff0c;类&#xff0c;值或类型规范。在IBM OS / 360及其后续版本…

webpack4:基本使用

webpack是基于Node构建&#xff0c;所以wepack支持所有Node API和语法。 即&#xff1a;Chrome浏览器能支持的ECMAScript语法&#xff08;排除DOM、BOM&#xff09;&#xff0c;wbpack都能支持。Chrome不支持ES6&#xff0c;所以webpack也不支持。 创建基本的webpack4.x项目&…

Kubernetes和Docker

定义上的区别 官方定义1&#xff1a;Docker是一个开源的应用容器引擎&#xff0c;开发者可以打包他们的应用及依赖到一个可移植的容器中&#xff0c;发布到流行的Linux机器上&#xff0c;也可实现虚拟化。 官方定义2&#xff1a;k8s是一个开源的容器集群管理系统&#xff0c;…