vuex实现简易购物车加购效果

news/2025/3/19 11:19:04/

目录

      • 一、加购效果动图
      • 二、前提条件
      • 三、开始操作
      • 四、解决vuex刷新数据丢失问题
      • 五、最终效果

一、加购效果动图

在这里插入图片描述

二、前提条件

创建了vue项目,安装了vuex

三、开始操作

目录结构如下:

在这里插入图片描述

main.js文件中引入store:

import Vue from 'vue'
import App from './App.vue'
import store from './store'Vue.config.productionTip = falsenew Vue({render: h => h(App),store,
}).$mount('#app')

page-index.vue页面组件代码如下:

<template><div><div class="item"><h1>我的购物车:</h1><ul><li v-for="(item, index) in this.$store.state.cartGoods" :key="index">商品名称:{{item.name}}<br><button @click="numRed(index)">-</button><span class="num">{{item.num}}</span><button @click="numAdd(index)">+</button><span>单价:¥{{item.price}}</span></li></ul></div><div class="item"><h1>商品列表:</h1><ul class="prod-list"><li v-for="(item, index) in prodList" :key="index"><span class="pro">名称:{{item.name}}</span><span class="pro">单价:{{item.price}}</span><span class="pro"><button @click="addCart(item)">加入购物车</button></span></li></ul></div></div>
</template><script>export default {data(){return{prodList:[{name:"CPU",price:999.99},{name:"显示器",price:199.99},{name:"显卡",price:1000},{name:"内存",price:500},{name:"硬盘",price:500}]}},methods: {numRed(index){this.$store.dispatch('red',index)},numAdd(index){this.$store.dispatch('add', index)},addCart(item){this.$store.commit('ADD_CART',item)}}}
</script><style scoped>.item{margin-bottom: 50px;}.prod-list{ line-height: 22px;}.prod-list li{ border-bottom: #ddd solid 1px; padding: 10px;}.prod-list li .pro{ min-width: 150px; display: inline-block; vertical-align: middle;}
</style>

state.js文件内容如下:

export default {cartGoods: []
}

getters.js文件内容如下:

export default {countGoods:(state)=>{var count={allNum:0,allPrice:0}state.cartGoods.forEach((item)=>{function ConvertAdd(arg1, arg2) {//加法精确运算var r1, r2, m;try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; }try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; }m = Math.pow(10, Math.max(r1, r2));var result = (arg1 * m + arg2 * m) / m;//return (arg1 * m + arg2 * m) / m;var ws = 1, ln = 0,lnArr1 = arg1.toString().split("."),lnArr2 = arg2.toString().split("."),ln1 = (lnArr1.length < 2) ? 0 : lnArr1[1].length,ln2 = (lnArr2.length < 2) ? 0 : lnArr2[1].length;if ((ln1 - ln2) >= 0) {ln = ln1;} else {ln = ln2;}if (ln > 0) {switch (ln) {case 0: { break; }case 1: { ws = 10; break; }case 2: { ws = 100; break; }case 3: { ws = 1000; break; }case 4: { ws = 10000; break; }case 5: { ws = 100000; break; }case 6: { ws = 1000000; break; }case 7: { ws = 10000000; break; }case 8: { ws = 100000000; break; }default: { break; }}}return Math.round(result * ws) / ws;}if(item.num>0){count.allNum +=item.num;count.allPrice =ConvertAdd(count.allPrice,Math.round(item.num*item.price * Math.pow(10, 3)) / Math.pow(10, 3));}})return count;}
}

mutations.js文件内容如下:

import { ADD,RED,ADD_CART } from './mutationTypes'
export default {// 我们可以使用 ES2015 风格的计算属性命名功能// 来使用一个常量作为函数名// 这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然[ADD](state,req){console.log(state.cartGoods,req);state.cartGoods[req].num++;},[RED](state,req){if(state.cartGoods[req].num>0){state.cartGoods[req].num--;}},[ADD_CART](state,req){var newFlag=true;for(var i=0; i<state.cartGoods.length; i++){if(state.cartGoods[i].name==req.name){newFlag=false;state.cartGoods[i].num++;break}}if(newFlag){let item={name:req.name,price:req.price,num:1}state.cartGoods.push(item);}}
}

mutationTypes.js内容如下:

export const ADD = 'ADD';
export const RED = 'RED';
export const ADD_CART = 'ADD_CART';

actions.js文件内容如下:

export default {red({commit},req){commit('RED',req);},add({commit}, req){commit('ADD', req)}
}

index.js文件内容如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)import state from '@/store/state.js';
import getters from "@/store/getters";
import mutations from "@/store/mutations";
import actions from "@/store/actions"const store = new Vuex.Store({// 用来存入状态state: state,// 计算属性(对state中的属性进行计算)getters: getters,mutations: mutations,actions: actions
})export default store

到此,已经能实现基本的加购操作了。

但是,有一个问题就是页面刷新的时候vuex里面的数据会丢失,购物车就会被清空。显然这是不符合实际购物的。要把数据存进本地才能避免这种情况。

四、解决vuex刷新数据丢失问题

修改state.js文件:

export default {//  从本地获取购物车商品数据,如果没有初始化为空数组cartGoods: JSON.parse(window.localStorage.getItem('cart-products')) || []
}

在mutations.js的ADD_CART方法中每次更改过的数据,都需要记录到本地存储中。增加一句:window.localStorage.setItem('cart-products', JSON.stringify(state.cartGoods))

最终文件内容如下:

import { ADD, RED, ADD_CART } from './mutationTypes'export default {[RED](state,req){// console.log(state, req)if(state.cartGoods[req].num > 0){state.cartGoods[req].num--;}},[ADD](state, req){state.cartGoods[req].num++;},[ADD_CART](state, req){var newFlag = true;for(var i = 0; i < state.cartGoods.length; i++){if(state.cartGoods[i].name == req.name){newFlag = false;state.cartGoods[i].num ++;break}}if(newFlag){let item = {name: req.name,price: req.price,num: 1}state.cartGoods.push(item)}window.localStorage.setItem('cart-products', JSON.stringify(state.cartGoods))}
}

五、最终效果

在这里插入图片描述
可见,现在刷新不会再清空购物车数据了。


http://www.ppmy.cn/news/1118614.html

相关文章

Linux C_C++的编译

GCC 官方网站GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译程序集合&#xff09;是最重要的开放源码软件。其他所有开放源码软件都在某种层次上依赖于它。甚至其他语言&#xff0c;例如 Python&#xff0c;都是由 C 语言开发的&#xff0c;由 GNU 编译程序编译的…

Flutter图标

https://fluttericon.cn/ Flutter 内置了丰富的图标。 Icon(Icons.ac_unit)

ABB COM0011 2RAA005844A0007J编码器模块

ABB COM0011 2RAA005844A0007J 编码器模块是用于测量和反馈旋转或线性位置信息的设备&#xff0c;通常用于自动化、机器控制和运动控制系统。以下是该编码器模块可能具备的产品功能&#xff1a; 位置测量&#xff1a;ABB COM0011 2RAA005844A0007J 编码器模块的主要功能是测量旋…

vue中预览epub文件

1. 引入epubjs yarn add epubjs 2. 页面中引入&#xff1a; import ePub from epubjs 3. 页面中目录和显示的div的代码 <div id"nav"><a-select v-model"selCatalog" style"width:100%" change"catalogChange"><a-se…

软件定制APP开发步骤分析|小程序

软件定制APP开发步骤分析|小程序 软件定制开发步骤&#xff1a; 1.需求分析&#xff1a; 这是软件定制开发的第一步&#xff0c;也是最关键的一步。在这个阶段&#xff0c;软件开发团队需要与客户进行沟通&#xff0c;了解客户的具体需求和期望。通过讨论和交流&#xff0c;确…

day45:C++ day5,运算符重载剩余部分、静态成员、继承

#include <iostream> #include <cstring> #define pi 3.14 using namespace std;class Shape { protected:double round;double area; public://无参构造Shape():round(40),area(100){cout<<"Shape::无参构造函数&#xff0c;默认周长为40&#xff0c;面…

腾讯mini项目-【指标监控服务重构】2023-07-19

今日已办 OpenTelemetry Logs 通过日志记录 API 支持日志收集 集成现有的日志记录库和日志收集工具 Overview 日志记录 API - Logging API&#xff0c;允许您检测应用程序并生成结构化日志旨在与其他 telemerty data&#xff08;例如metric和trace&#xff09;配合使用&am…

A股风格因子看板 (2023.09 第07期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景露等。 今日为该因子跟踪第7期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子收益走…