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

Vue.js提交表单前调用折扣函数报错:无法读取applyDiscount

问题排查与解决

报错原因很明确:forEach 里的普通函数会改变 this 的指向,此时函数内部的 this 不再指向 Vue 组件实例,所以找不到 applyDiscount 方法。

给你三种可行的解决方式:

方式一:使用箭头函数(推荐)

箭头函数不会绑定自身的 this,会继承外部作用域的 this(也就是 submit 方法里的 Vue 实例),代码修改如下:

submit() {
  this.campaign.items.forEach(item => {
      // 记得把计算后的折扣价赋值回item.price,否则原数据不会更新
      item.price = this.applyDiscount(item.price)
  })
  var data = new FormData()
  // 后续Axios提交逻辑
}

方式二:提前保存外部的this

把组件实例的 this 存到一个变量里,在 forEach 回调里用这个变量调用方法:

submit() {
  const that = this
  this.campaign.items.forEach(function(item) {
      item.price = that.applyDiscount(item.price)
  })
  var data = new FormData()
  // 后续Axios提交逻辑
}

方式三:利用forEach的第二个参数绑定this

forEach 支持第二个参数,用来指定回调函数内部的 this 指向:

submit() {
  this.campaign.items.forEach(function(item) {
      item.price = this.applyDiscount(item.price)
  }, this) // 这里传入组件实例的this,绑定回调里的this指向
  var data = new FormData()
  // 后续Axios提交逻辑
}

另外注意:你原来的代码只调用了 applyDiscount 方法,但没有把计算结果赋值给 item.price,这样原数据不会有变化,提交时还是原价,一定要补上赋值操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:50:24