优化购物车数据逻辑

This commit is contained in:
TOP糯米 2023-04-08 20:02:48 +08:00
parent d1050658ac
commit 5043db03b5
5 changed files with 63 additions and 61 deletions

View File

@ -19,7 +19,7 @@
<script> <script>
import WidgetCountModify from "@/components/widgets/count-modify"; import WidgetCountModify from "@/components/widgets/count-modify";
import ServicePreviewItem from "@/components/service/preview-item"; import ServicePreviewItem from "@/components/service/preview-item";
import { mapState } from "vuex"; import { mapGetters } from "vuex";
export default { export default {
name: "component-cate-template-list", name: "component-cate-template-list",
data() { data() {
@ -36,8 +36,8 @@ export default {
}, },
}, },
computed: { computed: {
...mapState({ ...mapGetters({
briefCart: (state) => state.cart.briefCart, briefCart: "cart/briefCart",
}), }),
}, },
components: { components: {

View File

@ -58,7 +58,7 @@ import WidgetTips from "@/components/widgets/tips";
import WidgetCheckBox from "@/components/widgets/checkbox"; import WidgetCheckBox from "@/components/widgets/checkbox";
import WidgetCountModify from "@/components/widgets/count-modify"; import WidgetCountModify from "@/components/widgets/count-modify";
import ServicePreviewItem from "@/components/service/preview-item"; import ServicePreviewItem from "@/components/service/preview-item";
import { mapGetters } from "vuex"; import { mapGetters, mapState } from "vuex";
export default { export default {
name: "order-cart", name: "order-cart",
data() { data() {
@ -75,37 +75,39 @@ export default {
ServicePreviewItem, ServicePreviewItem,
}, },
computed: { computed: {
...mapState({
cart: (state) => state.cart.cart,
}),
...mapGetters({ ...mapGetters({
isLogin: "user/isLogin", isLogin: "user/isLogin",
}), }),
}, },
onLoad() { async onLoad() {
if (!this.isLogin) { if (!this.isLogin) {
this.$store.commit("user/showLoginModal", true); this.$store.commit("user/showLoginModal", true);
return; return;
} }
await this.$store.dispatch("cart/update");
this.list = []; this.list = [];
this.$models.cart.list().then((list) => { this.cart.list.forEach((item) => {
list.forEach((item) => { let goods = [];
let goods = []; item.good.forEach((v) => {
item.good.forEach((v) => { goods.push({
goods.push({ id: v.gid,
id: v.gid, name: v.title,
name: v.title, times: v.post_hits,
times: v.post_hits, cover: v.thumbnail,
cover: v.thumbnail, price: v.money,
price: v.money, number: v.number,
number: v.number,
checked: false,
});
});
this.list.push({
name: item.cate,
total: 0,
list: goods,
checked: false, checked: false,
}); });
}); });
this.list.push({
name: item.cate,
total: 0,
list: goods,
checked: false,
});
}); });
}, },
onShow() {}, onShow() {},
@ -166,7 +168,9 @@ export default {
this.updateTotal(idx.parentIndex); this.updateTotal(idx.parentIndex);
}); });
} else { } else {
this.$utils.toast("亲,不能再" + (e.type == "sub" ? "减少" : "增加") + "了~"); if (e.type == "sub") {
this.deleteCart(idx.parentIndex, idx.itemIndex);
}
} }
}, },
/** /**

View File

@ -25,7 +25,7 @@
<text class="iconfont icon-gouwuche"></text> <text class="iconfont icon-gouwuche"></text>
</view> </view>
<view class="cart-number"> <view class="cart-number">
<text class="text">{{ cartCount }}</text> <text class="text">{{ briefCart.count }}</text>
</view> </view>
</movable-view> </movable-view>
</movable-area> </movable-area>
@ -58,10 +58,10 @@ export default {
computed: { computed: {
...mapState({ ...mapState({
currentCateId: (state) => state.system.currentCateId, currentCateId: (state) => state.system.currentCateId,
cartCount: (state) => state.cart.count,
}), }),
...mapGetters({ ...mapGetters({
isLogin: "user/isLogin", isLogin: "user/isLogin",
briefCart: "cart/briefCart",
}), }),
}, },
async onLoad() { async onLoad() {

View File

@ -16,7 +16,7 @@
<text class="iconfont icon-gouwuche"></text> <text class="iconfont icon-gouwuche"></text>
</view> </view>
<view class="cart-number"> <view class="cart-number">
<text class="text">{{ cartCount }}</text> <text class="text">{{ briefCart.count }}</text>
</view> </view>
</view> </view>
<view class="order-btn" :class="{ active: canUse }" @click="toCart"> <view class="order-btn" :class="{ active: canUse }" @click="toCart">
@ -29,7 +29,7 @@
<script> <script>
import AppLayout from "@/components/layout/layout"; import AppLayout from "@/components/layout/layout";
import AppCate from "@/components/cate/cate"; import AppCate from "@/components/cate/cate";
import { mapGetters, mapState } from "vuex"; import { mapGetters } from "vuex";
export default { export default {
name: "service-list", name: "service-list",
data() { data() {
@ -46,11 +46,9 @@ export default {
AppCate, AppCate,
}, },
computed: { computed: {
...mapState({
cartCount: (state) => state.cart.count,
}),
...mapGetters({ ...mapGetters({
isLogin: "user/isLogin", isLogin: "user/isLogin",
briefCart: "cart/briefCart",
}), }),
}, },
onLoad(e) { onLoad(e) {
@ -63,8 +61,8 @@ export default {
onShareTimeline() {}, onShareTimeline() {},
onShareAppMessage() {}, onShareAppMessage() {},
watch: { watch: {
cartCount(count) { briefCart(cart) {
this.canUse = count > 0; this.canUse = cart.count > 0;
}, },
}, },
methods: { methods: {
@ -76,7 +74,7 @@ export default {
if (this.isLogin) { if (this.isLogin) {
this.$store.dispatch("cart/update"); this.$store.dispatch("cart/update");
} }
this.canUse = this.cartCount > 0; this.canUse = this.briefCart.count > 0;
if (!e.id) { if (!e.id) {
return this.$utils.toast("参数错误"); return this.$utils.toast("参数错误");
} }

View File

@ -3,42 +3,42 @@ import cart from '@/core/models/cart';
export default { export default {
namespaced: true, namespaced: true,
state: { state: {
count: 0, cart: {
briefCart: {
loaded: false, loaded: false,
ids: [], list: [],
list: {},
}, },
}, },
getters: {}, getters: {
briefCart(state) {
let data = {
count: 0,
ids: [],
list: {},
};
state.cart.list.forEach((item) => {
item.good.forEach((k) => {
data.count += k.number;
data.list[k.gid] = k.number;
});
});
data.ids = Object.keys(data.list);
return data;
}
},
mutations: { mutations: {
count(state, data) { cart(state, data) {
state.count = data; state.cart = data;
},
briefCart(state, data) {
state.briefCart = data;
} }
}, },
actions: { actions: {
update(context, refresh) { async update(context, refresh) {
if (!context.state.briefCart.loaded || refresh) { if (!context.state.cart.loaded || refresh) {
cart.list().then((list) => { await cart.list().then((list) => {
let count = 0, data = { context.commit('cart', {
ids: [], list: list,
list: {},
};
list.forEach((item) => {
item.good.forEach((k) => {
count += k.number;
data.list[k.gid] = k.number;
});
});
data.ids = Object.keys(data.list);
context.commit('briefCart', {
...data,
loaded: true, loaded: true,
}); });
context.commit('count', count);
}); });
} }
} }