老师代码优化后又出现了问题,明明和老师一样啊

老师代码优化后又出现了问题,明明和老师一样啊

http://img1.sycdn.imooc.com//climg/612c4a6309a6ef7207120964.jpg

cartList?.[shopId]?.productList?.[productId]?.count || 0

进行优化后的代码

<template>

<div class="content">

<div class="category">

<div

:class="{

category__item: true,

'category__item--active': currentTab === item.tab,

}"

v-for="(itemindexin catogories"

:key="index"

@click="handleTabClick(item.tab)"

>

{{ item.name }}

</div>

</div>

<div class="product">

<div class="product__item" v-for="item in list" :key="item._id">

<img class="product__item__img" :src="item.imgUrl" />

<div class="product__item__detail">

<h4 class="product__item__title">{{ item.name }}</h4>

<p class="product__item__sales">月售 {{ item.sales }} 件</p>

<p class="product__item__price">

<span class="product__item__yen">&yen;</span>{{ item.price }}

<span class="product__item__origin">`&yen;{{ item.oldPrice }}</span>

</p>

</div>

<div class="product__number">

<span

class="product__number__minus"

@click="changeCartItem(shopIditem._iditem, -1shopName)"

>-</span

>

{{getProductCartCount(shopIditem._id)}}

<span

class="product__number__pius"

@click="changeCartItem(shopIditem._iditem1shopName)"

>+</span

>

</div>

</div>

</div>

</div>

</template>


<script>

import { useRoute } from "vue-router";

import { reactivereftoRefswatchEffect } from "vue";

import { useStore } from "vuex";

import { useCommonCartEffect } from "./commonCartEffect";

import { get } from "../../utils/request";


const catogories = [

{

name: "全部商品",

tab: "all",

},

{

name: "秒杀",

tab: "seckill",

},

{

name: "新鲜水果",

tab: "fruit",

},

];

// 和Tab切换相关的逻辑

const useTabEffect = () => {

const currentTab = ref(catogories[0].tab);

const handleTabClick = (tab=> {

currentTab.value = tab;

};

return { currentTabhandleTabClick };

};


// 列表内容相关的逻辑

const useCurrentListEffect = (currentTabshopId=> {

const content = reactive({ list: [] });


const getContentData = async () => {

const result = await get(`/api/shop/${shopId}/products`, {

tab: currentTab.value,

});

if (result?.errno === 0 && result?.data) {

content.list = result.data;

}

};


// 当首次页面加载的时候,或者方法所依赖的数据变化的时候执行

watchEffect(() => {

getContentData();

});


const { list } = toRefs(content);

return {

list,

};

};


// 购物车相关逻辑

const useCartEffect = () => {

const store = useStore();

const { cartListchangeCartItemInfo } = useCommonCartEffect();

const changeShopName = (shopIdshopName=> {

store.commit("changeShopName", { shopIdshopName });

};


const changeCartItem = (shopIdproductIdproductInfonumshopName=> {

changeCartItemInfo(shopIdproductIdproductInfonum);

changeShopName(hopIdshopName);

};

const getProductCartCount = (shopIdproductId=> {

return cartList?.[shopId]?.productList?.[productId]?.count || 0

};

return { cartListchangeCartItemgetProductCartCount };

};

export default {

name: "Content",

props: ["shopName"],

setup() {

const route = useRoute(); //当前访问路径的信息

const shopId = route.params.id;

const { currentTabhandleTabClick } = useTabEffect();


const { list } = useCurrentListEffect(currentTabshopId);

const { cartListchangeCartItemgetProductCartCount } = useCartEffect();

return {

catogories: catogories,

currentTab,

list,

shopId,

cartList,

changeCartItem,

handleTabClick,

getProductCartCount

};

},

};

</script>


<style lang="scss" scoped>

@import "../../style/virables.scss";

@import "../../style/mixins.scss";

.content {

displayflex;

positionabsolute;

left0;

right0;

top1.5rem;

bottom0.5rem;

}

.category {

overflow-yscroll;

height100%;

width0.76rem;

background$search-bgColor;

&__item {

line-height0.4rem;

text-aligncenter;

font-size0.14rem;

color$content-fontcolor;

&--active {

backgroundwhite;

}

}

}

.product {

overflow-yscroll;

flex1;

&__item {

positionrelative;

displayflex;

padding0.12rem 0;

margin0 0.16rem;

border-bottom0.01rem solid $content-bgColor;

&__detail {

overflowhidden;

}

&__img {

width0.68rem;

height0.68rem;

margin-right0.16rem;

}

&__title {

margin0;

line-height0.2rem;

font-size0.14rem;

color$content-fontcolor;

@include ellipsis;

}

&__sales {

margin0.06rem 0;

line-height0.16rem;

font-size0.12rem;

color$content-fontcolor;

}

&__price {

margin0;

line-height0.2rem;

font-size0.14rem;

color$hightlingt-fontColor;

}

&__yen {

font-size0.12rem;

}

&__origin {

margin-left0.06rem;

line-height0.2rem;

font-size0.12rem;

color$light_fontColor;

text-decorationline-through;

}

.product__number {

positionabsolute;

right0.18rem;

bottom0.12rem;

&__minus,

&__pius {

displayinline-block;

width0.2rem;

height0.2rem;

line-height0.16rem;

border-radius50%;

font-size0.2rem;

text-aligncenter;

}

&__minus {

border0.01rem solid $medium_fontColor;

color$medium_fontColor;

margin-right0.05rem;

}

&__pius {

background$btn-bgColor;

colorwhite;

margin-left0.05rem;

}

}

}

}

</style>






正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕慕子 2021-08-30 14:55:01

同学你好,确实是同学改写的代码问题,针对你的问题解答如下:

1、逻辑虽然没有变化,但是获取数据方式有误,导致无法实现效果(在第二条中解释了具体原因)

2、因为toRefs转换后,无法直接获取数据值,需要通过打点调用value属性才可以获取到数据值,所以代码中直接使用解构后的cartList是无法获取数据值,导致无法实现效果。

如果想要使用toRefs,可以参考如下调整:

http://img1.sycdn.imooc.com//climg/612c808109856cad10650371.jpg

祝学习愉快~


好帮手慕慕子 2021-08-30 11:54:03

同学你好,在源码中测试同学的粘贴的代码,出现如下报错:

http://img1.sycdn.imooc.com//climg/612c5424093a7d4604610521.jpg

由于changeCartItem方法中调用changeShopName传入的shopId少写了s,导致报错hopId未定义。

建议修改:

http://img1.sycdn.imooc.com//climg/612c54550981281610320189.jpg

经过上述修改后,效果实现是对的,如下:

http://img1.sycdn.imooc.com//climg/612c559109a1147904430713.jpg
如果经过上述修改后还有问题,同学可以先下载源码,对比排查下,如果排查不出来,可以将你的Cart.vue、commonCartEffect.js,shop.vue和store/index.js文件中共的代码全部粘贴过来,老师帮你测试下。

祝学习愉快~

  • 提问者 weixin_慕丝2377090 #1


    CommonCartEffect.js

    // 购物车相关逻辑

    import { useStore } from "vuex";

    import { toRefs } from "vue";

    export const useCommonCartEffect = () => {

    const store = useStore();

    const { cartList } = toRefs(store.state);

    const changeCartItemInfo = (shopIdproductIdproductInfonum=> {

    store.commit("changeCartItemInfo", { shopIdproductIdproductInfonum });

    };

    return { cartListchangeCartItemInfo };

    };



    我答应了数据是正常的但都无法正常显示http://img1.sycdn.imooc.com//climg/612c5cfd09fc1e0e21081214.jpg


    2021-08-30 12:25:23
  • 提问者 weixin_慕丝2377090 #2

    老师内容太大了无法穿输

    2021-08-30 12:27:33
  • 提问者 weixin_慕丝2377090 #3

    老师最终问题解决了,但我觉得并不是这个问题造成的

    是结构造成的

    // 购物车相关逻辑

    import { useStore } from "vuex";

    import { toRefs } from "vue";

    export const useCommonCartEffect = () => {

    const store = useStore();

    const cartList = store.state.cartList;

    // 写成这个就会出现优化后cart不能展开,且content数量没有反应,但是Vuex的state是没有问题的

    //const { cartList } = toRefs(store.state);

    const changeCartItemInfo = (shopId, productId, productInfo, num) => {

    store.commit("changeCartItemInfo", { shopId, productId, productInfo, num });

    };

    return { cartList, changeCartItemInfo };

    };



    我感觉很困惑,

    1:为什么没有优化就不会出现这些问题呢?逻辑没有变化啊。

    2:为什么这样获得的cartList会出问题?

    2021-08-30 12:45:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师