多商铺–添加购物车
1、基本流程
判断购物车是否为空> 如果不为空> 判断商铺是否存在> 如果商铺存在> 判断要添加的商品是否在该商铺中> 如果商品存在> 直接修改商品数量即可 如果商品不存在> 把商品添加至对应的商铺中 如果为空> 直接加入商铺和商品
2、代码实现
方法一
有点复杂,但是容易理解
if (state.cartListDatas.length > 0) {
// 进来就说明本地存储里有数据了
let noShop = state.cartListDatas.every(item => {
// 返回false说明本地有该店铺
return item.ru_id != data.ru_id;
})
let shopIndex = state.cartListDatas.findIndex(item => {
// 找到这个对应店铺的索引
return item.ru_id == data.ru_id;
})
if (noShop) {
state.cartListDatas.push(data)
} else {
// 说明有店铺,接着判断该店铺是否存在该商品
let noGood = state.cartListDatas[shopIndex].children.every(item => {
// 返回false说明店铺里面有该商品
return item.goods_id != data.children[0].goods_id
})
let goodsIndex = state.cartListDatas[shopIndex].children.findIndex(item => {
// 找到对应商品的索引
return item.goods_id == data.children[0].goods_id
})
if (noGood) {
state.cartListDatas[shopIndex].children.push(data.children[0])
} else {
// 说明有商品,直接把商品的加购数量更改即可
state.cartListDatas[shopIndex].children[goodsIndex].buyNum += data.children[0].buyNum
}
}
} else {
state.cartListDatas.push(data)
}
方法二
比较简单
判断商铺是否存在
let isShop = state.cartListDatas.find(item => {
return item.ru_id == data.ru_id
})
// 判断商品是否存在
let isGoods = state.cartListDatas.find(item => {
return item.children.find(value => {
return value.goods_id == data.children[0].goods_id
})
})
if (isShop) {
// 说明商铺存在
if (isGoods) {
// 说明该商品存在于对应的店铺中--直接操作加购数量即可
for (let i = 0; i < isGoods.children.length; i++) {
if (isGoods.children[i].goods_id == data.children[0].goods_id) {
isGoods.children[i].buyNum += data.children[0].buyNum
}
}
} else {
// 说明该商品在该店铺中不存在
isShop.children.push(data.children[0])
}
} else {
// 说明店铺不存在
state.cartListDatas.push(data)
}
3、项目实战
关于加购、删除、全选、数量修改的一些操作,基于本地存储进行实现购物车流程
export default {
state: {
cartListDatas: localStorage["carts"] ? JSON.parse(localStorage["carts"]) : [],
isSelectAll: localStorage["all"] ? JSON.parse(localStorage["all"]) : true
},
mutations: {
// 添加购物车
changeCartListDatas(state, data) {
if (state.cartListDatas.length > 0) {
// 进来就说明本地存储里有数据了
let noShop = state.cartListDatas.every(item => {
// 返回false说明本地有该店铺
return item.ru_id != data.ru_id;
})
let shopIndex = state.cartListDatas.findIndex(item => {
// 找到这个对应店铺的索引
return item.ru_id == data.ru_id;
})
if (noShop) {
state.cartListDatas.push(data)
} else {
// 说明有店铺,接着判断该店铺是否存在该商品
let noGood = state.cartListDatas[shopIndex].children.every(item => {
// 返回false说明店铺里面有该商品
return item.goods_id != data.children[0].goods_id
})
let goodsIndex = state.cartListDatas[shopIndex].children.findIndex(item => {
// 找到对应商品的索引
return item.goods_id == data.children[0].goods_id
})
if (noGood) {
state.cartListDatas[shopIndex].children.push(data.children[0])
} else {
// 说明有商品,直接把商品的加购数量更改即可
state.cartListDatas[shopIndex].children[goodsIndex].buyNum += data.children[0].buyNum
}
}
} else {
state.cartListDatas.push(data)
}
// 设置本地存储信息
localStorage.setItem("carts", JSON.stringify(state.cartListDatas))
},
// 点击-
reduceNum(state, data) {
state.cartListDatas.map(item => {
if (item.ru_id == data.cart.ru_id) {
// 找到对应的店铺--不必要更改单个数据,传来的数据已经时双向数据绑定的更改过的,直接替换对应的本地的数据对象即可
item.children[data.index] = data.cart
}
})
// 把仓库的数据设置到本地存储
localStorage.setItem("carts", JSON.stringify(state.cartListDatas))
},
// 点击+
addNum(state, data) {
state.cartListDatas.map(item => {
if (item.ru_id == data.cart.ru_id) {
// 和-的操作一样
item.children[data.index] = data.cart
}
})
// 同样设置本地存储
localStorage.setItem("carts", JSON.stringify(state.cartListDatas))
},
// 商品全选
goodsSelect(state, data) {
state.cartListDatas.map(item => {
// 找到该商品所在的店铺
if (item.ru_id == data.cart.ru_id) {
// 把对应的商品信息替换,因为传来的数据已经是更改过的
item.children[data.index] = data.cart
// 通过该店铺的所有的商品选中和未选中状态,更改店铺的选中状态
let flag = item.children.every(value => {
return value.isSelect == true
})
item.isShop = flag;
// 更改购物车的全选状态
state.isSelectAll = state.cartListDatas.every(item => {
return item.isShop == true
})
// 把购物车的全选和购物车的数据都设置本地存储
localStorage.setItem("all", state.isSelectAll)
localStorage.setItem("carts", JSON.stringify(state.cartListDatas))
}
})
},
// 店铺全选
shopSelect(state, data) {
// 每调用一次方法就直接改变店铺的选中状态
state.cartListDatas[data.index].isShop = !state.cartListDatas[data.index].isShop
// 找到该店铺,直接操作该店铺的商品的选中状态
state.cartListDatas[data.index].children.map(item => {
item.isSelect = state.cartListDatas[data.index].isShop
})
// 购物车的全选状态是根据购物车的每个店铺的全选状态决定的
state.isSelectAll = state.cartListDatas.every(item => {
return item.isShop == true
})
// 把购物车全选和购物车的数据都设置进本地存储--相当于更新本地存储
localStorage.setItem("all", state.isSelectAll);
localStorage.setItem("carts", JSON.stringify(state.cartListDatas))
},
// 购物车全选
selectAll(state) {
// 每调用一次方法就改变购物车的全选状态
state.isSelectAll = !state.isSelectAll
// 购物车全选状态改变,店铺和商品的选中状态也会改变
state.cartListDatas.map(item => {
// 改变店铺的选中状态
item.isShop = state.isSelectAll
item.children.map(value => {
// 改变商品的选中状态
value.isSelect = state.isSelectAll
})
})
// 把购物车全选和购物车的数据都设置本地存储--相当于更新
localStorage.setItem("carts", JSON.stringify(state.cartListDatas));
localStorage.setItem("all", state.isSelectAll);
},
delete(state, data) {
state.cartListDatas.map(item => {
// 找到该店铺
if (item.ru_id == data.cart.ru_id) {
item.children.splice(data.index, 1);
if (item.children.length < 1) {
let shopIndex = state.cartListDatas.findIndex(value => {
return value.ru_id == item.ru_id
})
state.cartListDatas.splice(shopIndex, 1)
}
}
})
localStorage.setItem("carts", JSON.stringify(state.cartListDatas));
}
},
actions: {}
}