You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React使用axios发送带请求体的post请求实现优惠券购买功能

解决方案

核心逻辑:你的每张优惠券卡片(MediaCard组件)已经通过props接收了当前优惠券的完整数据props.coupon,只需要在购买按钮的点击事件里,直接调用post接口,把这个对象作为请求体发送即可。

1. 修正Card组件的点击事件

你的handleSubmit现在只做了登录判断,补充购买请求逻辑即可,修改后的完整代码如下:

interface CardProps {
  coupon?: CouponModel;
}

export default function MediaCard(props: CardProps) {
  const history = useHistory();
  const classes = useStyles();

  // 改成异步函数,处理异步请求
  async function handleSubmit(){ 
    // 未登录跳转逻辑保留
    if(!store.getState().authState.user) {   
      notify.error(SccMsg.NOT_LOGGED);   
      history.push('/login')
      return
    }
    try {
      // axios.post第二个参数就是请求体,直接传入当前优惠券对象即可
      const response = await axios.post<CouponModel>(globals.urls.purchasedCoupon, props.coupon);
      // 购买成功后更新全局状态
      store.dispatch(couponPurchasedAction(response.data));
      notify.success("购买成功");
    } catch (err) {
      notify.error("购买失败,请稍后重试");
      console.error(err);
    }
  }

  // 其余render部分的代码保持不变即可
  return (
    <Card className={classes.root}>
      {/* 原有内容不变 */}
      <CardActions>
        <Button onClick={handleSubmit} size="small" color="primary">
          PURCHASE NOW!
        </Button>
      </CardActions>
    </Card>
  );
}

2. 可选优化说明

  • 如果后端接口只需要优惠券ID不需要完整对象,把请求体改成{ couponId: props.coupon.id }即可,根据你的接口需求调整。
  • 你之前写的PurchaseCoupon组件里的请求逻辑是放在componentDidMount里的,这个生命周期只会在组件首次挂载时触发,不符合点击购买才触发的需求,如果你想把购买逻辑抽离出来,可以封装成一个公共的异步函数,在各个需要的组件里引入调用即可。
  • 注意axios.post的参数规则:axios.post(请求地址, 请求体, 配置项),不需要额外套一层{data: {}},只有当你把请求体写在配置项里的时候才需要用data字段,比如:
    // 这种写法和上面直接传props.coupon是等价的,不推荐这么写,冗余
    axios.post(globals.urls.purchasedCoupon, {}, {
      data: props.coupon
    })
    

内容的提问来源于stack exchange,提问作者Anthony K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:57:03