CHROME -ROZŠÍŘENÍ: Jak mohu spustit předávání zpráv vícekrát?

0

Otázka

Já jsem pracoval na projektu, který vytváří Chrome rozšíření. V pozadí stránky mám funkci s názvem checkingProcess. Tato funkce je proveden, když novou kartu je otevřen, nebo je aktualizován kartu. (Snažila jsem se zachytit změnu URL zde.)

chrome.tabs.onActivated.addListener((activeInfo) => {
  checkingProcess(activeInfo.tabId)
})

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  checkingProcess(tab.id)
})

Pak, v checkingProcess funkce, mám některé funkce pro zpracování dat a volání API. Pak jsem se snažil se zobrazit zpráva, že pochází z popup. Tato zpráva představuje, že dav byl otevřen uživatelem.

 chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.msg === 'popup_opened') {
      sendResponse({
        matches_length: response['matches'].length,
        hostname: host,
      })
    }
    chrome.runtime.lastError
  })

Poté odešle odpověď na popup. V pop-up, poslouchám zprávy a odezvy použijte v místní nabídce.

 useEffect(() => {
    chrome.runtime.sendMessage({ msg: 'popup_opened' }, (res) => {
      setHostname(res['hostname'])
      setMatchesLength(res['matches_length'])
      console.log(res['hostname'], 'burası')
      console.log(res['matches_length'], 'burası')
    })
  }, [])

Nicméně, jsem si uvědomil, že tato zpráva proces se provede pouze jednou, ale musím udělat to několikrát, aby přístup k datům v pozadí současně. Jak to mám udělat, že?

1

Nejlepší odpověď

1

Vaše zpráva je odeslána pouze jednou, protože to je v současné době v nastavení React.useEffect s prázdný seznam závislostí. To znamená, že tento kód bude být spuštěn pouze jednou, když vaše složka je namontován. Pokud chcete spustit to "několikrát" nejprve je třeba definovat, co to znamená? Příklady jsou:

  • Provedení sendMessage poté, co uživatel provede nějakou akci, např. kliknutí na tlačítko. V tom případě nepotřebuješ useEffect. Místo, drát obslužnou rutinu události pro tlačítko a provést sendMessage tam.
  • Provedení sendMessage po re-render komponenty. Jednoduše vyjměte prázdný seznam závislostí ([]) z vašeho useEffect metoda. Poznámka: používat s opatrností. Pokud se vám nastavení vaší součástí tak, že to re-činí často, to může rychle proměnit v situaci, kdy mnoho volání API jsou vyrobeny.
  • Provedení sendMessage po nějaké státu v rámci své dílčí změny. Přidat tuto proměnnou do seznamu závislostí: [loaded]
  • Provedení sendMessage každých 10 sekund. Budete chtít používat setInterval ve vašem useEffect, jako je tento:
useEffect(() => {
  const interval = setInterval(() => {
    chrome.runtime.sendMessage({ msg: 'popup_opened' }, (res) => {
      setHostname(res['hostname'])
      setMatchesLength(res['matches_length'])
      console.log(res['hostname'], 'burası')
      console.log(res['matches_length'], 'burası')
    })
  }, 10000);
  return () => clearInterval(interval);
}, []);
2021-11-22 13:42:25

Chci, že při použití otevřené okno, to opět funguje.
Ceren Keklik

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................