簡體   English   中英

如何避免附加多個事件偵聽器?

[英]How to avoid multiple event listeners from being attached?

以下代碼是要附加多個事件偵聽器還是 React Native / expo-linking 一次只允許附加一個事件偵聽器?

import * as Linking from 'expo-linking'
import { useIsFocused } from '@react-navigation/native'

const MyComponent = () => {
  const isFocused = useIsFocused()

  useEffect(() => {
    fetchData()
    Linking.addEventListener('url', _handleEvent)
  }, [isFocused])

  const fetchData = () => {
    // ...
  }

  const _handleEvent = () => {
    // ...
  }

  return (
    <View><View>
  )
}

有沒有辦法檢查事件偵聽器是否已經存在,以便我可以執行以下操作:

useEffect(() => {
  fetchData()
  if(!eventListenerExists){
    Linking.addEventListener('url', _handleEvent)
  }
}, [isFocused])

它將附加多個處理程序,每次isFocused更改時添加一個。 要在附加下一個處理程序時刪除前一個處理程序,請返回一個 React 將調用的函數:

useEffect(() => {
  fetchData()
  Linking.addEventListener('url', _handleEvent)
  return () => Linking.removeEventListener('url', _handleEvent) // <======
}, [isFocused])

無論如何都想這樣做,以便在您的組件完全卸載時刪除處理程序。

這在此處的 React 文檔中有所介紹。

我想甚至應該打一次電話

useEffect(() => {
  Linking.addEventListener('url', _handleEvent)
  return () => Linking.removeEventListener('url', _handleEvent) // <======
}, [])

1、在useEffect回調中,返回移除監聽器的函數; 2、每次在綁定之前刪除監聽器。 如:

useEffect(() => {
    window.removeEventListener('url', hander);
    window.addEventListener('url', hander);
    return () => window.removeEventListener('url', hander);
}, [XXX])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM