老师请求失败,不知道为什么没有办法发送post请求
<template>
<div class="order">
<div class="order__price">实付金额 <b>¥ {{calculations.price}}</b></div>
<div class="order__btn" @click="() => handleShowConfirmChange(true)">提交订单</div>
</div>
<div
class="mask"
v-show="showConfirm"
@click="() => handleShowConfirmChange(false)"
>
<div class="mask__content" @click.stop>
<!-- .stop 阻止事件的捕获 -->
<h3 class="mask__content__title">确认要离开收银台?</h3>
<p class="mask__content__desc">请尽快完成支付,否则将被取消</p>
<div class="mask__content__btns">
<div
class="mask__content__btn mask__content__btn--first"
@click="() => handleConfirmOrder(true)"
>取消订单</div>
<div
class="mask__content__btn mask__content__btn--last"
@click="() => handleConfirmOrder(false)"
>确认支付</div>
<Toast v-if="show" :message="toastMessage" />
</div>
</div>
</div>
</template>
<script>
import { ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useStore } from 'vuex'
import { post } from '../../utils/request'
import { useCommonCartEffect } from '../../effects/cartEffects'
import Toast, { useToastEffeect } from "../../components/Toast.vue";
// 下单相关逻辑
const useMakeOrderEffect = (shopId, shopName, productList, showToast) => {
const router = useRouter()
const store = useStore()
const handleConfirmOrder = async (isCanceled) => {
const products = []
for(let i in productList.value) {
const product = productList.value[i]
products.push({id: parseInt(product._id, 10), num: product.count})
}
try {
const result = await post('/api/order', {
addressId: 1,
shopId,
shopName: shopName.value,
isCanceled,
products
})
if (result?.errno === 0) {
store.commit('clearCartData', shopId)
router.push({ name: 'Home' })
}
} catch (e) {
// 提示下单失败
showToast("请求失败");
}
}
return { handleConfirmOrder }
}
// 蒙层展示相关的逻辑
const useShowMaskEffect = () => {
const showConfirm = ref(false)
const handleShowConfirmChange = (status) => {
showConfirm.value = status
}
return { showConfirm, handleShowConfirmChange }
}
export default {
name: 'Order',
components: {
Toast: Toast,
},
setup() {
const route = useRoute()
const shopId = parseInt(route.params.id, 10)
const { show, toastMessage, showToast } = useToastEffeect();
const { calculations, shopName, productList } = useCommonCartEffect(shopId)
const { handleConfirmOrder } = useMakeOrderEffect(shopId, shopName, productList, showToast)
const { showConfirm, handleShowConfirmChange } = useShowMaskEffect()
return { show, toastMessage, showConfirm, handleShowConfirmChange, calculations, handleConfirmOrder }
}
}
</script>
正在回答 回答被采纳积分+1
同学你好,对于你的问题解答如下:
1、以源码为例,可以输出查看下clearCartData中传入的第一个参数值是什么,如下:
控制台输出结果如下:
由测试结果可知,传入第二个参数值为一个数字,所以无论第二个参数名是shopId还是payload(名称是可以自定义),值都是一个数字,const { shopId } = payload; 这种写法无法解构到对应的shopId值,导致无法实现效果。
所以直接使用一个传入的值进行操作就可以了,即:state.cartList[shopId].productList = {}
2、不清楚同学完整的代码具体是什么样,可能是传递的参数不对,也可能是网速较慢导致了请求超时。
从同学提供的截图看,代码执行时是与AJAX有关的xhr.js文件中代码出现报错,如下:
3、对于xhr.js等,这种并不是我们自己创建的文件代码执行过程中出现报错提示,由于涉及到vue框架的底层代码,老师目前也没有很好的快速定位错误的解决办法、
给同学推荐一个方法:在猜测可能存在问题的代码中,结合console.log语句,在控制台查看输出的结果是否与自己预期一样,慢慢调试。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星