使用vuex让购物车联动

news2024/10/5 19:13:28

在这里插入图片描述
在这里插入图片描述
// 1.vuex点击加减触发函数提交仓库把我们请求的数据存到仓库
2.在仓库定义这个函数和对象 把我们存进去的数据存起来
// 3。在我们需要的页面拿出数据,然后循环就可以
// 4.当我们点击加号就触发函数然后在vuex对这个数据进行处理
// 5.对我们点进来的数据进行一个对右边的循环我们只要判断他是否》0,如果是大于0就push到新的数组
6.然后拿到新的数组渲染到购物车里面

这个是goods页面 就是整体的页面 asidelist: [], 是左边要渲染的数据定义
rightlist: [],就是右边要渲染的数组

<template>
 <div class="box">
   <!-- 左边 -->
   <div class="leftbox">
     <van-sidebar v-model="activeKey">
       <van-sidebar-item
         @click="onChange"
         v-for="(v,i) in asidelist"
         :title="v.name"
         :key="i"
         :id="'cate' +i"
       />
     </van-sidebar>
   </div>
   <!-- 右边 -->
   <div class="rightbox">
     <div>
       <div v-for="(v,i) in rightlist" :key="i" :id="'list' +i">
         <h3>{{v.name}}</h3>
         <van-card
           v-for="(v2,i2) in v.foods"
           :key="i2"
           :num="v2.num"
           :price="v2.price"
           :desc="v2.goodsDesc"
           :title="v2.name"
           :thumb="v2.imgUrl"
         >
           <template #tags>
             <van-tag plain type="danger">标签</van-tag>
             <van-tag plain type="danger">标签</van-tag>
           </template>
           <template #footer>
             <van-stepper
               @change="changecate"
               v-model="v2.num"
               theme="round"
               button-size="16"
               min="0"
               disable-input
             />
           </template>
         </van-card>
       </div>
     </div>
   </div>
 </div>
</template>
<script>
import { goodsList } from "@/api/account.api";
import BScroll from "@better-scroll/core";
import { mapState, mapMutations } from "vuex";
export default {
 data() {
   return {
     activeKey: 0,
     bs: {},
     bsr: {}
   };
 },
 // 点击左边跳转到右边的节点
 methods: {
   onChange(i) {
     this.bsr.scrollToElement("#list" + i, 300);
   },
   // 4.当我们点击加号就触发函数然后在vuex对这个数据进行处理

   changecate() {
     this.$store.commit("changecate");
   }
 },
 async created() {
   // 页面初始化的时候把他提交给仓库,提交仓库要用commit去提交仓库里面去定义一个数组
   console.log(this.rightlist);
   const res = await goodsList();
   res.data.data.forEach(v => {
     v.foods.forEach(v2 => {
       v2.num = 0;
     });
   });
   // 1.vuex点击加减触发函数提交仓库把我们请求的数据存到仓库
   this.$store.commit("addlist", res.data.data);
   // 获取两个左右边的父节点
   this.$nextTick(() => {
     this.bs = new BScroll(".leftbox", {
       probeType: 3,
       click: true
     });
     this.bsr = new BScroll(".rightbox", {
       probeType: 3,
       click: true
     });

     // 拿到我们初始值的右边所有商品列表把他放到一个数组里面
     let arr = [];
     this.rightlist.forEach((v, i) => {
       arr.push(
         document.querySelector("#list" + i).offsetTop -
           document.querySelector("#list0").offsetTop
       );
     });

     // 给右边添加滚动事件
     this.bsr.on("scroll", v => {
       let y = Math.abs(v.y);

       for (let i = 0; i < arr.length; i++) {
         if (y >= arr[i] && y < arr[i + 1]) {
           this.activeKey = i;
           this.bs.scrollToElement("#cate" + i, 300);
           break;
         }
       }
     });
   });
 },
 // 3。在我们需要的页面拿出数据,然后循环就可以
 computed: {
   
   ...mapState(["rightlist"]),

   asidelist() {
     return this.rightlist;
   }
 }
};
</script>
<style lang="scss" scoped>
h3 {
 color: black;
 font-size: 14px;
 height: 4vh;
 line-height: 4vh;
 width: 100%;
 background-color: rgb(218, 209, 209);
 text-indent: 1em;
}
.box {
 display: flex;
 flex-direction: row;
 .leftbox {
   // width: 100px;
   overflow-y: hidden;
   background-color: f7f8fa;
   margin-bottom: 50px;
 }
 .rightbox {
   height: 100vh;
   flex: 1;
   margin-bottom: 100px;
   overflow-y: hidden;
   // background-color: antiquewhite;
 }
}
</style>


...............................................
下面是vuex的代码
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
 namespaced: true,
 state: {
   asidelist: [],
   rightlist: [],
 },

 mutations: {
   // 2.在仓库定义这个函数和对象  把我们存进去的数据存起来
   addlist(state, payload) {
     state.rightlist = payload;
   },
   // 5.对我们点进来的数据进行一个对右边的循环我们只要判断他是否》0,如果是大于0就push到新的数组
   changecate(state, payload) {
     let arr = [];
     state.rightlist.forEach((v) => {
       v.foods.forEach((v2) => {
         console.log(v2.num);
         if (v2.num > 0) {
           arr.push(v2);
           console.log(v2);
         }
       });
     });
     state.asidelist = arr;
   },
 },

 getters: {},

 actions: {},
 modules: {},
});
。。。。。。。。。。。。。。。。。。。。。。。。。。。



这个是我们下面 那个 购物车的代码
<template>
 <div class="cart">
   <!-- 购物车显示条 -->
   <div class="cartbar">
     <div class="concat">
       <van-icon name="smile-o" />联系商家
     </div>
     <div class="cartico">
       <van-badge v-if="asidelist.length>0" :content="asidelist.length">
         <van-icon name="shopping-cart" @click="show = !show" />
       </van-badge>
       <van-icon v-else name="shopping-cart" class="cartico-off" />

       <div class="price">
         <strong>{{tatol}}</strong>
         <span>{{asidelist.num}}</span>
       </div>
     </div>

     <div v-if="asidelist.length>0" class="delivery delivery-on">去结算</div>
     <div v-else class="delivery">20元起送</div>
   </div>

   <!-- 购物车列表 -->
   <van-popup v-model="show" round position="bottom" :style="{ height: '30%' }">
     <h1>新用户下单立减39</h1>
     <div class="clear">
       <span>购物车</span>
       <span>
         <van-icon name="delete-o" />清空购物车
       </span>
     </div>

     <ul>
       <li class="box" v-for="(v,i) in asidelist" :key="i">
         <span class="titeles">
           {{v.goodsDesc}}
         </span>
         <span>{{v.price*v.num}}</span>
         <van-stepper v-model="v.num" min="0" />
       </li>
     </ul>
   </van-popup>
 </div>
</template>
<script>
import { mapState } from "vuex";
import { reactive } from "vue";
export default {
 data() {
   return {
     show: false,
     value: 0
   };
 },
 created() {},
 computed: {
   ...mapState(["asidelist"]),
   tatol() {
     let sum = 0;
     this.asidelist.forEach(v => {
       sum += v.price * v.num;
     });
     return sum;
   }
 }
};
</script>

<style lang="scss" scoped>
.box {
 display: flex;
 justify-content: space-between;
 .titeles {
   display: block;
   overflow: hidden; //隐藏文字
   text-overflow: ellipsis; //显示 ...
   white-space: nowrap; //不换行
   width: 150px;
 }
}
.clear {
 display: flex;
 justify-content: space-between;
}
h1 {
 height: 30px;
 line-height: 30px;
 text-align: center;
 width: 100%;
 background-color: #ffcc30;
}
.cart {
 position: fixed;
 left: 0;
 bottom: 0;
}

.cartbar {
 z-index: 9999;
 position: fixed;
 // left: 2%;
 bottom: 10px;
 width: 88%;
 height: 70px;
 display: flex;
 color: #999;

 .concat {
   background: #222;
   width: 65px;
   font-size: 12px;
   text-align: center;
   padding-top: 10px;
   border-radius: 35px 0 0 35px;
   margin-right: 3px;

   .van-icon {
     font-size: 30px;
     display: block;
   }
 }

 .cartico {
   width: 1px;
   flex-grow: 1;
   background: #222;
   display: flex;

   .van-badge__wrapper {
     width: 50px;
     height: 50px;
     background: #ff0;
     font-size: 36px;
     line-height: 50px;
     text-align: center;
     border-radius: 30px;
     margin: 10px 7px;

     :deep(.van-badge--fixed) {
       top: 7px;
       right: 5px;
     }

     .van-icon {
       color: #000;
     }
   }

   .cartico-off {
     width: 56px;
     height: 56px;
     background: #333;
     font-size: 40px;
     line-height: 56px;
     text-align: center;
     border-radius: 30px;
     margin: 7px;
   }

   .price {
     width: 1px;
     flex-grow: 1;
     font-size: 12px;
     padding-top: 14px;

     strong {
       display: block;
       color: #fff;
       font-size: 20px;
     }
   }
 }

 .delivery {
   width: 70px;
   background: #222;
   font-size: 12px;
   line-height: 70px;
   border-radius: 0 35px 35px 0;
   text-align: center;
 }

 .delivery-on {
   background: #ff0;
   font-size: 14px;
   color: #000;
 }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用自适应去噪在线顺序极限学习机预测飞机发动机剩余使用寿命(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【零基础学Rust | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust4&#xff0c;Rust可以做什么 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编…

无头单链表,有完整测试程序

&#x1f35f;无头单链表 &#x1f47b;无头单链表的所有结点都存储有效信息 &#x1f47b;无头单链表相对带头单链表&#xff0c;在有些涉及更改头节点的函数上需要传二级指针 &#x1f35f;头文件list.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #includ…

不能乱点链接之获取cookie

这里是浏览器存储的某个网址的cookie 然后点击了链接就把参数获取到 因为document.cookie 会直接获取到浏览器cookie 所以为了拦截 存cookie的时候要设置&#xff1a; 设置httpOnly 只要http协议能够读取和携带 再document.cookie 就为空了 原文链接&#xff1a; 尚硅谷课程…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

SolidUI社区-从开源社区角度思考苹果下架多款ChatGPT应用

文章目录 背景下架背景下架原因趋势SolidUI社区的未来规划结语如果成为贡献者 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目…

Typescript中的元组与数组的区别

Typescript中的元组与数组的区别 元组可以应用在经纬度这样明确固定长度和类型的场景下 //元组和数组类似&#xff0c;但是类型注解时会不一样//元组赋值的类型、位置、个数需要和定义的类型、位置、个数完全一致&#xff0c;不然会报错。 // 数组 某个位置的值可以是注解中的…

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述 Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后&#xff0c;使用单个命令&#xff0c;您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系&#xff08;…

纷享销客携30+企业家朋友走进国产燃气轮机领军企业——新奥动力

7月26日下午&#xff0c;【数字中国-高效增长】名城优企游学系列活动之走进新奥动力成功举办&#xff01;新奥动力是国产燃气轮机领军企业&#xff0c;成立于2013年&#xff0c;致力于成为国际领先的微、小型燃气轮机制造商&#xff0c;其多项技术、产品填补国内空白。2022年新…

算法通关村—迭代实现二叉树的前序,中序,后序遍历

1. 前序中序后序递归写法 前序 public void preorder(TreeNode root, List<Integer> res) {if (root null) {return;}res.add(root.val);preorder(root.left, res);preorder(root.right, res);}后序 public static void postOrderRecur(TreeNode head) {if (head nu…

基于Web智慧森林防火GIS监测预警可视化系统

森林火灾是森林最危险的敌人&#xff0c;也是林业最可怕的灾害&#xff0c;它会给森林带来毁灭性的后果。 建设背景 森林火灾&#xff0c;重在预防。随着现代技术的快速发展&#xff0c;数字化森林监控已成为及早发觉&#xff0c;排除森林火灾隐情的必要手段。充分利用现代科…

C++ 指针数组

如果一个数组的每个元素都是指针变量&#xff0c;这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。 1.一维指针数组 声明一维指针数组的语法形式&#xff1a; 数据类型*数组名[下标表达式];下标表达式指出数组元素的个数&#xff0c;数据类型确定每个元素…

【雕爷学编程】MicroPython动手做(29)——物联网之SIoT

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

浙大数据结构第六周之06-图3 六度空间

题目详情&#xff1a; “六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一…

动手学深度学习—卷积神经网络(原理解释+代码详解)

目录 1. 从全连接层到卷积层2. 图像卷积2.1 互相关运算2.2 卷积层2.3 图像中目标的边缘检测2.4 学习卷积核2.5 特征映射和感受野 3. 填充和步幅3.1 填充3.2 步幅 4. 多输入多输出通道4.1 多输入通道4.2 多输出通道4.3 11卷积核 5. 汇聚层5.1 最大汇聚层和平均汇聚层5.2 填充和步…

Stable Diffusion - SDXL 模型测试 (DreamShaper 和 GuoFeng v4) 与全身图像参数配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132085757 图像来源于 GuoFeng v4 XL 模型&#xff0c;艺术风格是赛博朋克、漫画、奇幻。 全身图像是指拍摄对象的整个身体都在画面中的照片&…

Bean的实例化方法

目录 1.工厂模式通常有三种形态&#xff1a; 2.简单工厂 2.1 静态工厂 2.1通过factory-bean实例化 2.3通过FactoryBean接口实例化 3.测试 关于容器的使用 3.1获得spring文件方式 3.2getBean方式 4.关闭容器 1.工厂模式通常有三种&#xff1a; 第一种&#xff1a;简单工…

二叉树题目:叶子相似的树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;叶子相似的树 出处&#xff1a;872. 叶子相似的树 难度 3 级 题目描述 要求 考虑一个二叉树上所有的叶子&…

消息队列项目(1)

概念 这里的消息队列, 大致上就是一个生产者消费者模型. 我这个消息队列是仿照 RabbitMQ 的实现原理来进行编写的 需求分析 有几个核心的概念: 生产者(Producer)消费者(Consumer)中间人(Broker)发布(Publish) :生产者向中间人投递消息的过程订阅(Subcribe) :记录哪些消费者…

Java面试题 如何提高自己的算法?

练习一&#xff1a;飞机票 需求:机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&a…