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

React内联onClick事件传递错误值问题求助

React 日历点击传值错误的解决方案

你遇到的是典型的闭包陷阱:循环中创建的事件处理函数共享了同一个循环变量的引用,当循环结束时变量已经变成最后一次迭代的值,所以点击任何日期都会触发最后那个值的回调。

错误代码示例(对应你的问题场景)

// 错误写法:所有onClick共享同一个i的引用
const dates = []
for (var i = 1; i <= 12; i++) {
  dates.push(
    <div key={i} onClick={() => selectedDate(i)}>{i}</div>
  )
}

合规解决方案

方案1:用map渲染(推荐,更符合React范式)

利用数组map的迭代特性,每个迭代项都会创建独立的作用域,确保每个onClick捕获到当前的日期值:

const dateElements = Array.from({ length: 12 }, (_, idx) => idx + 1).map(day => {
  return (
    <div 
      key={day} 
      onClick={() => selectedDate(day)}
    >
      {day}
    </div>
  )
})

方案2:for循环中创建独立作用域

如果必须用for循环,用立即执行函数(IIFE)为每次迭代创建独立作用域,把当前日期值传入:

const dates = []
for (let i = 1; i <= 12; i++) {
  (function(currentDay) {
    dates.push(
      <div key={currentDay} onClick={() => selectedDate(currentDay)}>{currentDay}</div>
    )
  })(i)
}

方案3:ES6 for循环用let(注意变量声明)

ES6的let在for循环中每次迭代都会创建新的变量绑定,替代var就能解决问题:

const dates = []
for (let i = 1; i <= 12; i++) { // 这里用let,每次迭代的i都是独立的
  dates.push(
    <div key={i} onClick={() => selectedDate(i)}>{i}</div>
  )
}

核心原理

本质是让每个onClick事件处理函数都能捕获到独立的日期变量引用,而不是共享循环结束后的最终变量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:10:57