[英]Correct way to pass inputs into event handlers
我在我的代碼中創建了一個 onClick 事件處理程序,並遇到了一個稍微令人困惑的事件。 我正在測試console.log
以查看傳遞給事件處理程序的內容,並發現雖然傳遞了一個名為teamId
的變量,但console.log
建議將 class 傳遞給它。
我的原始代碼如下:
const renderedOptions = Object.keys(comps,).map((compName, index) =>{
const teamId = comps[compName].id
return(
<div
key={teamId}
className="item"
onClick = {(teamId)=>console.log(teamId)}
>
{compName}
</div>
)
})
console.log
返回Class {dispatchConfig: {…}, _targetInst: FiberNode, nativeEvent: MouseEvent, type: "click", target: div.item, …}
。
然后我通過將onClick
箭頭 function 更改為()=>console.log(teamId)
來調整代碼,它返回了我最初預期的常量teamId
的值。
有人可以解釋為什么(teamId)=>console.log(teamId)
返回 class object,而()=>console.log(teamId)
返回 teamId 的實際值嗎?
因為事件處理程序是使用事件 object 作為參數調用的。 擁有像(event) => {...}
這樣的代碼會更合乎邏輯。
當然,您可以自己選擇參數的名稱。 因此,在您的示例中(teamId) => {...}
您正在調用參數teamId
(在具有相同名稱的外部 scope 中隱藏局部變量),當然您仍然會收到事件 object 傳遞給它,並且當您在 function 正文中寫入teamId
時,您實際上訪問了您在參數中獲得的事件 object (因為它是具有該名稱的“最接近”(范圍)變量)。
使用() => {...}
(或(anyOtherName) => {...}
),您不會與外部范圍的teamId
變量名稱發生沖突,因此在 function 中寫入teamId
會改為訪問該變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.