CHROME -ROZSZERZENIA: Jak mogę uruchomić przesyłanie wiadomości kilka razy?

0

Pytanie

Pracuję nad projektem, który tworzy rozszerzenie Chrome. Na tle stronie u mnie jest funkcja o nazwie checkingProcess. Ta funkcja jest uruchamiana po otwarciu nowej karty lub aktualizacji karty. (Próbowałem łapać zmiana adresu URL jest tutaj.)

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

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

Następnie, w checkingProcess funkcja, mam pewne funkcje dla obróbki danych i połączeń API. Następnie próbowałem dostać komunikat, który przychodzi z wyskakującego okna. Ten komunikat oznacza, że okno było otwarte przez użytkownika.

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

Wtedy on wysyła odpowiedź na okno pop-up. W oknie podręcznym ja прослушиваю komunikat i używam odpowiedź w oknie pop-up.

 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ı')
    })
  }, [])

Rozumiem jednak, że ten proces wysyłania wiadomości odbywa się tylko jeden raz, ale muszę go uruchomić kilka razy, aby jednocześnie uzyskać dostęp do danych w tle. Jak mogę to zrobić?

1

Najlepsza odpowiedź

1

Wiadomość jest wysyłana tylko raz, bo obecnie jest skonfigurowane w React.useEffect z pustą listą zależności. Oznacza to, że kod ten będzie uruchomiony tylko jeden raz podczas montowania danego składnika. Jeśli chcesz uruchomić go "kilka razy", najpierw trzeba ustalić, co to znaczy? Przykładami są:

  • Przeprowadzenie sendMessage po tym, jak użytkownik wykona jakąś czynność, na przykład, kliknie przycisk. W takim przypadku nie trzeba useEffect. Zamiast tego podłączyć moduł obsługi zdarzeń do przycisku i wykonaj sendMessage tam.
  • Przeprowadzenie sendMessage po ponownym renderowania danego składnika. Wystarczy usunąć pustą listę zależności ([]od waszego useEffect metoda. Uwaga: należy używać z rozwagą. Jeśli skonfigurujesz swój składnik w taki sposób, aby często перерисовывался, to może szybko doprowadzić do sytuacji, gdy odbywa się wiele wywołań API.
  • Przeprowadzenie sendMessage po zmianie jakiegoś stanu w danym składniku. Dodaj tę zmienną na listę zależności: [loaded]
  • Przeprowadzenie sendMessage co 10 sekund. Chcesz użyć setInterval w pobliżu useEffectwłaśnie tak:
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

Chcę, aby podczas korzystania z wyskakującego okna "Otwórz" jest znowu działało.
Ceren Keklik

W innych językach

Ta strona jest w innych językach

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