網站搜尋

reactjs - 我該如何修復「[ts] 屬性 'getAttribute' 在類型 'EventTarget' 上不存在」


我正在嘗試在 React 中使用 TypeScript 創建一個 onClick 事件類型,以捕捉 target 屬性。但我收到錯誤「[ts] 屬性 'getAttribute' 在類型 'EventTarget' 上不存在。」有人可以提供關於如何修正這個問題的最佳做法的建議嗎?

我嘗試為 event.target 部分使用另一個輔助函數。這樣我可以在這個部分進行排版,並在這個函數中處理 getAttribute 部分。然而,有人告訴我這不是最佳做法,也是錯誤的方法。

const Option = (props: OptionProps) => {

  const HandleOptionChange = (event: React.MouseEvent<HTMLLIElement>) => {
    return props.onOptionChange(event.target.getAttribute('value'));
  }

  return (
    <li
      key={props.key}
      value={JSON.stringify(props.word)}
      onClick={HandleOptionChange}
    >
      {props.word.value}
    </li>
  )
}

ts 錯誤訊息:

[ts] 屬性 'getAttribute' 在類型 'EventTarget' 上不存在。 any

答案#1

這對我有效

const HandleOptionChange = (event: React.MouseEvent<HTMLLIElement>) => {
    const el = event.target as HTMLInputElement
    return props.onOptionChange(el.getAttribute('value'));
  }

我剛剛把 HTMLInputElement 加為 event.target 的類型

答案#2

老問題,但以防其他人遇到它,這裡有一個答案:

你應該使用 event.currentTarget 而不是 event.target

event.currentTarget 指向你附加監聽器的元素。在本例中,它是 HTMLLIElement,如 React.MouseEvent<HTMLLIElement> 所指定的

`event.target` 另一方面,是觸發事件的元素,它可能不是附加監聽器的那個元素!如果 `<li>` 的任何子元素被點擊,都可能觸發滑鼠事件。由於元素的類型未知,它可以是任何東西(`<p>` 或 `<img>` 或 `<div>` 或其他任何元素),因此 TypeScript 無法確認它上面是否存在任何值或方法。

考慮這個:

return (
  <li
    key={props.key}
    value={JSON.stringify(props.word)}
    onClick={HandleOptionChange}
  >
    content of the li
    <div>
      header title for the image
      <img src="https://example.image.source/" />
    </div>
  </li>
)

你可以點擊圖片,event.target 將會是 <img> 元素,而 <img> 元素沒有 value 屬性,這會導致你的程式碼拋出錯誤。如果你點擊「圖片的標題標頭」,同樣的情況也會發生,event.target 將會是 <div> 元素。

使用 event.currentTarget 將始終返回監聽器附加的 <li> 元素,無論在任何這些情況下。這樣你的代碼在所有這些情況下將會如你所預期的那樣運行,而不會拋出錯誤。

順便說一下,對於任何因其他類似情況而查看這個問題的人:Davit 的回答只是針對症狀而沒有解決原因,並且可能會在你自己的程式碼庫中將錯誤隱藏起來。請確保你了解為什麼會出現錯誤,這樣你才能修正它,而不僅僅是隱藏它。