Day46:项目-购物车案例

2023-09-16 23:28:43

购物车案例

  1. 准备工作
    1. 首页默认加载,其余页面懒加载

    2. 调用defineStore方法构建store

    3. 入口main做对应配置,找指南,快速开始,把elementplus引入进来
import { createApp } from "vue";
import { createPinia } from "pinia";
import "./style.css";
import App from "./App.vue";
import router from "./router";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
const app = createApp(App);
const pinia = createPinia();
app.use(router);
app.use(pinia);
app.use(ElementPlus);
app.mount("#app");
    1. api就是用来模拟后台接口的

  1. 在app.vue中做购物车首页,头部不进入路由,在头部的底部放RouterView
  2. 给app 的header添加插槽#header,写类名添加样式,头部插槽内的内容不会发生变化
<template>
  <div>
    <el-card class="box-card">
      <template #header>
        <div class="card-header">
          <h1>购物车首页</h1>
          <div class="btn">
            <RouterLink to="/productlist">
              <el-button type="primary">商品列表</el-button></RouterLink
            >
            <RouterLink to="/shoppingcar"
              ><el-button type="primary">购物车</el-button></RouterLink
            >
          </div>
        </div>
      </template>
      <RouterView />
    </el-card>
  </div>
</template>
    1. 写购物车首页的标题
    2. 写el-button:商品列表,购物车。并用routerLink包裹,做一个导航,并为RouterLink添加to页面
  1. 在商品列表页面,写一个el-table,
<template>
    <div class="product-list">
      <el-table :data="shoppingCarStore.productList" stripe style="width: 100%">
        <el-table-column prop="id" label="序号" align="center" />
        <el-table-column prop="title" label="商品名称" align="center" />
        <el-table-column prop="price" label="商品价格" align="center" />
        <el-table-column prop="number" label="库存" align="center" />
        <el-table-column prop="address" label="操作" align="center">
          <template #default="scope">
            <el-button type="success" @click="add(scope.row)">
              添加到购物车
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </template>
  1. 在store中写方法,初始化商品列表和初始化商品数据的方法
import { defineStore } from "pinia";
import { computed, ref } from "vue";
import { getProducts } from "../api/product";
import { ElMessage } from "element-plus";
import { buyProducts } from "../api/product.js";
const useShoppingCarStore = defineStore("shopping-car", () => {
  //初始化商品列表数据
  const productList = ref([]);
  //初始化购物车列表数据
  const shopCarList = ref([]);
    1. 一秒钟之后获取到数据(模拟从接口获取数据),
//1s中之后返回数组数据
export const getProducts = async ()=>{
    //为了模拟真实的接口请求
    await wait(1000)
    return products
}
    1. 方法在数据获取的部分有定义。
    2. 把两个需要给视图使用的方法从store中导出,并在商品列表中导入方法
    3. 绑定在table中,
  1. 给table添加按钮
    1. 改变button样式
    2. 绑定add方法,在页面中传参scope.row,代表点选的那一行。(scope代表插槽的作用域)在方法中传参row
<script setup>
import { useShoppingCarStore } from "../store";
const shoppingCarStore = useShoppingCarStore();
shoppingCarStore.getProductList();
function add(row) {
  //调用 将数据添加到购物车的方法
  shoppingCarStore.addShopCarList(row);
}
</script>
  1. 在store中写给购物车添加数据的方法
    1. 减去商品列表页面的库存:res的item id === row id时,下转判断,判断完自减--
    2. 添加购物车列表页面的商品数量,_res的item id === row id时,下转判断
      1. 在store中定义初始化购物车列表
      2. 判断购物车中是否已经存在这个商品
      3. 如果存在,将商品数量+1(_res.number++
      4. 如果没有,添加一个新商品(起始数量一定是1
    1. 判断当库存<1,写一个提示,商品已经妹有了,存在一秒。
    2. 导出方法并在列表页调用,放在add方法中,add传入的参数为row,指在点选的那一行。
const useShoppingCarStore = defineStore("shopping-car", () => {
  //初始化两行
......
  //初始化商品列表数据的方法(使用async方法,没有一大堆回调函数
  const getProductList = async () => {
    const res = await getProducts();
    productList.value = res;
  };
  // const getProductList = () => {
  //   getProducts().then((res) => {
  //     productList.value = res;
  //   });
  // };
  //给购物车添加数据的方法
  const addShopCarList = (row) => {
    //1. 减去商品列表页面的商品库存
    const res = productList.value.find((item) => item.id === row.id);
    if (res.number < 1) {
      ElMessage.error({
        message: "没有库存辣!",
        duration: 1000,
      });
      return;
    }
    res.number--;
    //2. 添加购物车列表页面的商品数量
    const _res = shopCarList.value.find((item) => item.id === row.id);
    //2.1 判断购物车列表数据中是否包含当前的商品 如果包含 让数量自增
    //2.2 如果不包含 将这个商品添加到购物车列表
    if (!_res) {
      shopCarList.value.push({
        id: row.id,
        title: row.title,
        price: row.price,
        number: 1,
      });
    } else {
      _res.number++;
    }
    //给购物车列表中的商品按照id的升序做一个排序
    shopCarList.value.sort((a, b) => {
      return a.id - b.id;
    });
  };
...
  return{...addShopCarList,...};
  1. 在购物车列表中写el-table
    1. 引入useshoppingcarstore,并绑定数据.shopCarList
    2. 绑定prop属性,表示绑定了哪个属性
  1. 在store中添加排序功能,商品加入购物车后按照id自动排序,写在_res判断下面
    1. shopCarList.value.sort((a,b) => {})

getProductsList方法最好使用async和await语法,而不是等价的.then。因为async和await语法不涉及大量的回调函数,也就不用进行大量的回调函数嵌套,处理起来更简单不容易出错。

//初始化商品列表数据的方法
  const getProductList = async () => {
    const res = await getProducts();
    productList.value = res;
  };
  // const getProductList = () => {
  //   getProducts().then((res) => {
  //     productList.value = res;
  //   });
  // };
  1. 写普通的table计算shopCarList里的商品总价
    1. 使用computed计算属性计算商品总价。
    2. const一个totalPrice
const useShoppingCarStore = defineStore("shopping-car", () => {
  //初始化商品列表数据
......
  //计算shopcarList里的商品总价
  const totalPrice = computed(() => {
    //reduce
    return shopCarList.value.reduce((pre, cur) => {
      return pre + cur.number * cur.price;
    }, 0);
  });
  .....
  return {...totalPrice,...};
});
    1. return一个reduce方法,它是一个数组遍历中常用的方法。第一个参数为回调逻辑,第二个参数为累加初始值(大多数为0)

    2. 把商品总价渲染到页面
  1. 在商品列表页写一个结算商品的button,
    1. 绑定点击事件calc(vue2不能直接绑click,需要加字符;vue3的组件绑定会判断是否为原生事件)
    2. 在store中写calc方法
    3. 结算方法已经写在products中,引入到store中。
    4. 该方法通过一个随机数来随机判断结算是否成功。、
    5. 这是一个异步方法,需要async和await
    6. 判断结算是否成功,成功弹出成功,并清空数组;
    7. 结算失败弹出失败,不清空列表,需要再次结算。
const useShoppingCarStore = defineStore("shopping-car", () => {
 ......
  //结算商品列表的方法
  const calc = async () => {
    const res = await buyProducts();
    if (res) {
      ElMessage.success({
        message: "结算成功",
        duration: 1000,
      });
      shopCarList.value = [];
    } else {
      ElMessage.error({
        message: "结算失败",
        duration: 1000,
      });
    }
  };
  return {
    ....
    calc,
  };
});
  1. 购物车中,对结算框v-if判断,如果购物车列表没有数据,则不显示结算框。
<template>
  <div class="shopping-car">
    <el-table :data="shoppingCarStore.shopCarList">
      <el-table-column prop="id" label="序号" align="center" />
      <el-table-column prop="title" label="名称" align="center" />
      <el-table-column prop="price" label="价格" align="center" />
      <el-table-column prop="number" label="数量" align="center" />
    </el-table>
    <div class="btn" v-if="shoppingCarStore.shopCarList.length">
      <h2>商品总价是:{{ shoppingCarStore.totalPrice }}</h2>
      <el-button type="primary" @click="calc">结算商品</el-button>
    </div>
  </div>
</template>

<script setup>
import { useShoppingCarStore } from "../store";
const shoppingCarStore = useShoppingCarStore();
function calc() {
  //触发商品结算的方法 calc()
  shoppingCarStore.calc();
}
</script>
更多推荐

React 简介

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录ComponentJSXMultiplecomponentsprops:passingdatatocomponentsSomenotes我们现在将开始入门的可能是本课程最重要的主题,即React-库。让我们从制

ArmSom-W3开发板之PCIE的开发指南(一)

1.简介RK3588从入门到精通本⽂介绍RK平台配置pcie的方法开发板:ArmSoM-W32、PCIE接口概述PCIe(PeripheralComponentInterconnectExpress)是一种用于连接计算机内部组件的高速接口标准。以下是关于PCIe接口的简要介绍:高速传输:PCIe接口提供了高速的数据传输

0018Java程序设计-springboot智慧环卫养管作业平台

文章目录摘要目录系统设计开发环境摘要本智慧环卫养管作业平台就是建立在充分利用现在完善科技技术这个理念基础之上,并使用IT技术进行对环卫养管作业的管理,从而保证环卫养管作业能够高效的进行,可以实现环卫养管作业的在线管理,这样保证了资源共享效率的最优化,通过系统的管理,使系统的使用率达到最大化。论文采用图文论述方法,通过与

vite+vue3+ts项目基础配置

1.配置项目启动自动打开浏览器在package.json文件中:"scripts":{"dev":"vite",//项目初始化之后默认是这样的-->"dev":"vite--open",//改成这样,加上--open,这样是默认打开浏览器页面},2.项目中eslint校验工具的配置首先安装eslintpnpmiesli

python机器人编程——用python实现一个写字机器人

目录一、前言二、整体框架2.1系统构成2.2硬件介绍2.2.1主要组成部分2.2.2机械结构2.2.3驱动及控制主板PS电机驱动原理简介:2.2.4其余部分2.3机器人python程序框架2.3.1通信服务模块2.3.2消息处理模块2.3.3轨迹解析模块2.3.4机械臂逆解模块2.3.5写字板模块三、机械臂的建模3.1

问道管理:机器人产业迎催化 黄金价格或将突破前高

昨日,沪指盘中震动下探,一度跌近1%逼近3100点,尾盘逐步止跌;深成指、创业板指均跌超1%。截至收盘,沪指跌0.45%报3123.07点,深成指跌1.14%报10255.87点,创业板指跌1.14%报2027.73点,科创50指数跌1.39%;两市合计成交6982亿元,北向资金净卖出近66亿元。行业方面,软件、轿车、

如何利用Java实现 AI 人脸融合特效

Java实现AI人脸融合特效项目背景AI人脸融合特效的原理代码实现第一步:调用token接口人脸融合部分工具类最终效果图项目背景最近自从chat-gpt爆火以来,AI技术在人工智能领域持续迭代的创新,为人们的生活带来了许多震撼的应用。比如其中的,AI人脸融合特效,在各大抖音、B站等平台上,越来越火热,基于这,我也打算利

使用 Next.js、Langchain 和 OpenAI 构建 AI 聊天机器人

在当今时代,将AI体验集成到您的Web应用程序中变得越来越重要。LangChain与Next.js的强大功能相结合,提供了一种无缝的方式来将AI驱动的功能引入您的应用程序。在本指南中,我们将学习如何使用Next.js,LangChain,OpenAILLM和VercelAISDK构建AI聊天机器人。文章目录Langch

细说 Spring Cloud Gateway

1.SpringCloudGateway简介与核心概念在微服务架构中,API网关是一个非常重要的组件,它可以帮助我们实现服务的路由、负载均衡、认证授权等功能。SpringCloudGateway是SpringCloud官方推出的一个基于Spring5、SpringBoot2和ProjectReactor的API网关实现

Linux centOS yum install MySQL5.7

下载并安装MySQLYUM仓库wgethttps://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmsudoyumlocalinstallmysql57-community-release-el7-11.noarch.rpm这将为您的CentO

PKE 安全性的提升方式:Naor-Yung、Fischlin、Fujisaki-Okamoto

参考文献;[NY90]NaorM,YungM.Public-keycryptosystemsprovablysecureagainstchosenciphertextattacks[C]//Proceedingsofthetwenty-secondannualACMsymposiumonTheoryofcomputin

热文推荐