shopName不显示
<template>
<div class="content">
<div class="category">
<div
:class="{'category__item':true,'category__item--active':currentTab === item.tab}"
v-for="item in categories"
:key="item.name"
@click="() => { handleTabClick(item.tab)}">{{item.name}}</div>
</div>
<div class="product">
<div class="product__item"
v-for="item in list"
:key="item._id">
<img :src=item.imgUrl class="product__item__img">
<div class="product__item__detail">
<h4 class="product__item__title">{{item.name}}</h4>
<p class="prosduct__item__sales">月售:{{item.sales}}</p>
<p class="product__item__price">
<span class="product__item__price__yen">¥</span>{{item.price}}
<span class="product__item__price__origin">¥{{item.oldPrice}}</span>
</p>
</div>
<div class="product__num">
<span
class="product__num__minus"
@click="()=>{ changeCartItem(shopId, item._id, item, -1, shopName)}"
>-</span>
<!-- 因为最开始购物车里没有内容,所以CartList里面就是空的,所以要用?.来访问CartList -->
{{getProductCartCount(shopId, item._id)}}
<span
class="product__num__plus"
@click="()=>{ changeCartItem(shopId, item._id, item, 1)}"
>+</span>
</div>
</div>
</div>
</div>
</template>
<script>
import { reactive, ref, toRefs, watchEffect } from 'vue'
import { get } from '../../utils/request'
import { useRoute } from 'vue-router'
import { useCommonCartEffect } from '../../effects/cartEffects.js'
import store from '@/store'
const categories = [{
name: '全部商品',
tab: 'all'
}, {
name: '秒杀',
tab: 'seckill'
}, {
name: '新鲜水果',
tab: 'fruit'
}]
// 跟 tab 切换相关的逻辑
const useTabEffect = () => {
const currentTab = ref(categories[0].tab)
const handleTabClick = (tab) => {
currentTab.value = tab
}
return { handleTabClick, currentTab }
}
const useCurrentListEffect = (currentTab, shopId) => {
const content = reactive({ list: [] })
const getContentData = async () => {
// 设置一个data接收请求返回的结果
const result = await get(`/api/shop/${shopId}/products`, { tab: currentTab.value })
if (result?.errno === 0 && result?.data?.length) {
content.list = result.data
}
}
watchEffect(() => {
getContentData()
})
const { list } = toRefs(content)
return { list }
}
// 跟购物车相关的内容
const useCartEffect = () => {
const { changeItemToCart, cartList } = useCommonCartEffect()
// 改变商店的名字
const changeShopName = (shopId, shopName) => {
console.log('changeShopName', shopName)
store.commit('changeShopName', { shopId, shopName })
}
const changeCartItem = (shopId, productId, productInfo, num, shopName) => {
console.log('changeCartItem', shopName)
changeItemToCart(shopId, productId, productInfo, num)
changeShopName(shopId, shopName)
}
const getProductCartCount = (shopId, productId) => {
return cartList?.[shopId]?.productList?.[productId]?.count || 0
}
return { cartList, changeCartItem, getProductCartCount }
}
export default {
name: 'Content',
props: ['shopName'],
setup () {
const route = useRoute()
const shopId = route.params.id
const { handleTabClick, currentTab } = useTabEffect()
const { list } = useCurrentListEffect(currentTab, shopId)
const { cartList, changeCartItem, getProductCartCount } = useCartEffect()
return { categories, list, handleTabClick, currentTab, shopId, changeCartItem, cartList, getProductCartCount }
}
}
</script>
<style lang="scss" scoped>
@import '../../style/variables.scss';
@import '../../style/mixins.scss';
.content {
position: absolute;
top: 1.5rem;
right: 0;
left: 0;
bottom: .5rem;
display: flex;
}
.category {
width: .76rem;
height: 100%;
background: $search-bgColor;
overflow-y: scroll;
&__item {
line-height: .4rem;
text-align: center;
font-size: .14rem;
color: $content-fontcolor;
&--active {
background: $white-fontColor;
}
}
}
.product {
overflow-y: scroll;
flex: 1;
&__item {
position: relative;
display: flex;
padding: .12rem 0;
margin: 0 .16rem;
border-bottom: .01rem solid $content-bgColor;
&__img {
width: .68rem;
height: .68rem;
margin-right: .16rem;
}
&__title {
line-height: .2rem;
font-size: .14rem;
color: $content-fontcolor;
margin: 0;
@include ellipsis;
}
&__detail {
overflow: hidden;
}
&__sales {
line-height: .16rem;
font-size: .12rem;
margin: .06rem 0;
color: $content-fontcolor;
}
&__price {
line-height: .2rem;
font-size: .14rem;
color: $hignlight-fontColor;
margin: 0;
&__yen {
font-size: .12rem;
}
&__origin {
margin-left: .06rem3;
font-size: .1rem;
color: $light-fontColor;
line-height: .2rem;
text-decoration: line-through;
}
}
.product__num {
position: absolute;
right: 0;
bottom: .12rem;
font-size: 14px;
color: $content-fontcolor;
&__minus, &__plus {
display: inline-block;
height: .18rem;
width: .18rem;
border-radius: 50%;
font-size: .2rem;
line-height: .16rem;
text-align: center;
}
&__minus {
border: .02rem solid $medium-fontColor;
color: $medium-fontColor;
margin-right: .08rem;
}
&__plus {
background-color: $btn-bgColor;
color: $white-fontColor;
border: .02rem solid $btn-bgColor;
margin-left: .08rem;
}
}
}
}
</style><template>
<div class="wrapper">
<div class="top">
<div class="top__header">
<div class="iconfont top__header__back"></div>
确认订单
</div>
<div class="top__receiver">
<div class="top__receiver__title">收货地址</div>
<div class="top__receiver__address">北京理工大学国防科技园2号楼10层</div>
<div class="top__receiver__info">
<span class="top__receiver__info__name">瑶妹(先生)</span>
<span class="top__receiver__info__phone">18911024266</span>
</div>
<div class="iconfont top__receiver__icon"></div>
</div>
</div>
<div class="products">
<div class="products__title">{{shopName}}</div>
<div class="products__list">
<div class="products__item"
v-for = "item in productList"
:key="item._id"
>
<img :src="item.imgUrl" class="products__item__img">
<div class="products__item__detail">
<h4 class="products__item__title">{{item.name}}</h4>
<p class="products__item__price">
<span class="products__item__single">
<span class="products__item__price__yen">¥</span>{{item.price}} x {{item.count}}
</span>
<span class="products__item__total">
<span class="products__item__price__yen">¥</span>{{item.price * item.count}}
</span>
</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { useCommonCartEffect } from '../../effects/cartEffects.js'
import { useRoute } from 'vue-router'
export default {
name: 'OrderConfirmation',
setup () {
const route = useRoute()
const shopId = route.params.id
const { productList, shopName } = useCommonCartEffect(shopId)
return { productList, shopName }
}
}
</script>
<style lang="scss" scoped>
@import '../../style/variables.scss';
@import '../../style/mixins.scss';
.wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: #eee;
}
.top {
position: relative;
height: 1.96rem;
background-size: 100% 1.59rem;
background-image: linear-gradient(0deg, rgba(0,145,255,0.00) 4%, #0091FF 50%);
background-repeat: no-repeat;
&__header {
position: relative;
padding-top: .26rem;
text-align: center;
font-size: .16rem;
color: #FFFFFF;
line-height: .22rem;
&__back {
position: absolute;
left: .18rem;
font-size: .22rem;
}
}
&__receiver {
position: absolute;
left: .18rem;
right: .18rem;
bottom: 0;
height: 1.11rem;
background-color: #fff;
border-radius: .04rem;
padding: .16rem;
box-sizing: border-box;
&__title {
font-size: .16rem;
color: #333333;
margin-bottom: .14rem;
}
&__address {
font-size: .14rem;
color: #333333;
margin-bottom: .06rem;
}
&__info {
font-size: .12rem;
color: #666666;
}
&__icon {
color: #666;
position: absolute;
right: .06rem;
top: .5rem;
font-size: .20rem;
transform: rotate(180deg);
}
}
}
.products {
background-color: #fff;
margin: .16rem .18rem .55rem .18rem;
&__title {
font-size: .14rem;
line-height: .22rem;
color: #333333;
padding: .16rem;
}
&__item {
position: relative;
display: flex;
padding-bottom: .16rem;
margin: 0 .16rem;
&__img {
width: .46rem;
height: .46rem;
margin-right: .16rem;
}
&__title {
line-height: .2rem;
font-size: .14rem;
color: $content-fontcolor;
margin: 0;
@include ellipsis;
}
&__detail {
overflow: hidden;
flex: 1;
}
&__price {
line-height: .2rem;
font-size: .14rem;
color: $hignlight-fontColor;
margin: .06rem 0 0 0;
display: flex;
&__yen {
font-size: .12rem;
}
}
&__total {
flex: 1;
text-align: right;
color: #000;
}
}
}
</style>import { useStore } from 'vuex'
import { computed } from 'vue'
// 跟购物车相关逻辑
export const useCommonCartEffect = (shopId) => {
// 创建Vuex的实例
const store = useStore()
// 从Vuex中把cartList的数据结构出来
const cartList = store.state.cartList
// 从购物车中添加数据的方法
const changeItemToCart = (shopId, productId, productInfo, num) => {
// commit 方法是同步的将数据修改不需要发送任何请求
store.commit('changeItemToCart', { shopId, productId, productInfo, num })
// console.log(shopId, productId, productInfo)
}
// 购物车的商品列表
const productList = computed(() => {
// 如果 cartList 里面的 shopId 不存在,那就
const productList = cartList[shopId]?.productList || []
return productList
})
// 订单的商铺名称
const shopName = computed(() => {
const shopName = cartList[shopId]?.shopName || ''
console.log(shopName)
return shopName
})
return { cartList, productList, shopName, changeItemToCart }
}import { createStore } from 'vuex'
const setLocalCartList = (state) => {
const { cartList } = state
const cartListString = JSON.stringify(cartList)
localStorage.cartList = cartListString
}
const getLocalCartList = () => {
return JSON.parse(localStorage.cartList) || {}
}
export default createStore({
// Vuex用来存储全局的变量。
state: {
cartList: getLocalCartList()
},
getters: {
},
mutations: {
changeItemToCart (state, payload) {
const { shopId, productId, productInfo } = payload
const shopInfo = state.cartList[shopId] || { shopName: '', productList: {} }
let product = shopInfo.productList[productId]
// 如果 productInfo 不存在,就将productInfo 设为传过来的 productInfo
if (!product) {
product = productInfo
product.count = 0
}
product.count += payload.num
if (product.count < 0) {
product.count = 0
}
if (product.count > 0) {
product.checked = true
}
shopInfo.productList[productId] = product
state.cartList[shopId] = shopInfo
setLocalCartList(state)
},
changeCartItemChecked (state, payload) {
const { shopId, productId } = payload
const product = state.cartList[shopId].productList[productId]
product.checked = !product.checked
setLocalCartList(state)
},
clearCartProducts (state, payload) {
const { shopId } = payload
state.cartList[shopId].productList = {}
setLocalCartList(state)
},
setCartItemsChecked (state, payload) {
const { shopId } = payload
const productList = state.cartList[shopId].productList
if (productList) {
for (const i in productList) {
const product = productList[i]
product.checked = true
}
}
setLocalCartList(state)
},
changeShopName (state, payload) {
const { shopId, shopName } = payload
console.log(shopName)
const shopInfo = state.cartList[shopId] || { shopName: '', productList: {} }
shopInfo.shopName = shopName
state.cartList[shopId] = shopInfo
console.log(shopName)
setLocalCartList(state)
}
},
actions: {
},
modules: {
}
})6
收起
正在回答
1回答
同学你好,Content组件如下位置没有传shopName,需要补上参数:

同学添上试试。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星