为啥当我使用箭头函数 onClick 时我的变量未定义?

Posted

技术标签:

【中文标题】为啥当我使用箭头函数 onClick 时我的变量未定义?【英文标题】:Why my variable is undefined when I'm using an arrow function onClick?为什么当我使用箭头函数 onClick 时我的变量未定义? 【发布时间】:2019-07-10 07:15:51 【问题描述】:

在我的反应组件中,orders[i] 被定义,因为组件是使用名称和数量呈现的,但是,当涉及到 onClick 事件时,orders[i] 在箭头函数的上下文中是未定义的。如何使用 orders[i].name 作为参数调用该函数?

let orders = this.state.orders;
let ordersRender =[];
for (var i=0; i<orders.length; i++) 
  if (orders[i].amount) 
    let newInvoiceItem = <InvoiceItem name=orders[i].name amount =orders[i].amount key=i handleDelete=() => this.deleteProduct(orders[i].name)/>;
    ordersRender.push(newInvoiceItem);
   

【问题讨论】:

【参考方案1】:

handleDelete 事件被触发时,变量i 已将其值更改为orders.length,这就是orders[i]onClick 被触发时未定义的原因。

因此,使用Array#map 代替for-loop 来迭代订单并返回InvoiceItem 项目数组。由于amount是可选的,所以我们需要在应用.map函数之前根据数量过滤订单。

let  orders  = this.state;
let ordersRender = orders.filter(order => order.amount).map((name, amount, index) => 
  return (
    <InvoiceItem name=name amount =amount key=index handleDelete=() => this.deleteProduct(name)/>
  );
)
...

希望这会有所帮助!

【讨论】:

【参考方案2】:

只需将 var 更改为 let 即可解决此问题。

【讨论】:

以上是关于为啥当我使用箭头函数 onClick 时我的变量未定义?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我重载数组运算符时我的私有变量为零? [关闭]

为啥 JSX 道具不应该使用箭头函数或绑定?

为啥在将 next.js 与环境变量一起使用时我的 API 密钥可见?

为啥在单独的线程中修改时我的变量没有改变? c++/升压

为啥我没有编码时我的班级正在执行算术?

vuex 3.6为啥在方法中使用它时我的状态对象未定义