Clipboard API: kopiowanie i wklejanie w React
Implementować przyciski kopiowania do schowka za pomocą nowoczesnego Clipboard API i zapewniać poprawne działanie w starszych przeglądarkach
Clipboard API: kopiowanie i wklejanie w React to bezpłatna lekcja React Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.
Zapisywanie do schowka
navigator.clipboard.writeText(text) zapisuje ciąg znaków w schowku systemowym i zwraca obiekt Promise. Jest nowoczesnym zamiennikiem starszego podejścia opartego na execCommand. Zawsze należy używać await dla obiektu Promise i obsługiwać ewentualne odrzucenie, na przykład gdy użytkownik odmówi dostępu do schowka.
Odczytywanie ze schowka
navigator.clipboard.readText() odczytuje bieżącą zawartość schowka jako ciąg znaków i również zwraca obiekt Promise. Odczyt wymaga uprawnienia clipboard-read, o którego udzielenie przeglądarka prosi użytkownika. W praktyce w typowych aplikacjach React odczyt ze schowka jest używany rzadziej niż zapis.
Zapisywanie do schowka wymaga gestu użytkownika
Przeglądarki wymagają, aby clipboard.writeText było wywoływane wyłącznie w ramach procedury obsługi gestu użytkownika, takiego jak zdarzenie kliknięcia lub keydown. Wywołanie go wewnątrz useEffect albo asynchronicznie po wykonaniu gestu spowoduje błąd bezpieczeństwa. Zapis należy zawsze uruchamiać bezpośrednio z procedury obsługi onClick.
Wzorzec interfejsu kopiowania do schowka
Standardowy wzorzec wygląda następująco: użytkownik klika przycisk kopiowania, procedura obsługi wywołuje navigator.clipboard.writeText(value), po pomyślnym wykonaniu ustawia stan copied na true, a przycisk tymczasowo wyświetla znacznik wyboru lub etykietę "Skopiowano!". Po krótkim opóźnieniu przycisk powraca do zwykłego stanu.
Tworzenie hooka useCopyToClipboard
Należy zamknąć tę logikę w hooku useCopyToClipboard, który zwraca krotkę: [copied, copyFn]. Wartość logiczna copied steruje informacją zwrotną interfejsu, a copyFn przyjmuje tekst do skopiowania. Hook wewnętrznie obsługuje asynchroniczny zapis i wszelkie błędy, dzięki czemu komponenty pozostają proste.
Resetowanie stanu copied
W hooku po pomyślnym skopiowaniu należy wywołać setCopied(true) i zaplanować reset za pomocą setTimeout(() => setCopied(false), 2000). Identyfikator limitu czasu należy przechowywać i usuwać w funkcji czyszczącej useEffect, aby zapobiec aktualizowaniu stanu po odmontowaniu komponentu. Pozwala to uniknąć ostrzeżenia "cannot update state on an unmounted component".
Starsze rozwiązanie zastępcze z execCommand
Starsze przeglądarki i strony niekorzystające z HTTPS nie obsługują Clipboard API. Starsze rozwiązanie zastępcze tworzy tymczasowy element textarea, ustawia jego wartość, dołącza go do body, wywołuje document.execCommand('copy'), a następnie usuwa element. To podejście działa synchronicznie i jest obsługiwane wszędzie, choć zostało wycofane.
Sprawdzanie dostępności Clipboard API
Przed użyciem Clipboard API należy sprawdzić: navigator.clipboard && typeof navigator.clipboard.writeText === 'function'. Jeśli API jest niedostępne, należy użyć starszego rozwiązania opartego na execCommand. To sprawdzenie zabezpieczające zapobiega błędom w czasie działania w środowiskach, które nie obsługują tego API.
Uprawnienie do odczytu schowka
Odczyt schowka wymaga uprawnienia użytkownika za pośrednictwem Permissions API. Bieżący stan można sprawdzić za pomocą: navigator.permissions.query({ name: 'clipboard-read' }), które zwraca obiekt PermissionStatus ze stanem granted, denied lub prompt. Przeglądarka automatycznie poprosi o uprawnienie po wywołaniu readText().
Wymóg HTTPS
Clipboard API jest dostępne wyłącznie w bezpiecznych kontekstach (HTTPS lub localhost). Na stronach HTTP navigator.clipboard ma wartość undefined. Jest to ograniczenie bezpieczeństwa, ponieważ zawartość schowka może zawierać poufne dane. Zawsze należy sprawdzać dostępność API przed odwołaniem się do jego metod, aby uniknąć błędów odwołań do wartości null.
Testowanie schowka w jsdom
jsdom (używany przez Jest) nie implementuje Clipboard API. Należy je zamockować w konfiguracji testów: Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(undefined) } }). Dzięki temu można sprawdzić, czy komponent wywołuje writeText z poprawnym argumentem, bez korzystania z rzeczywistego środowiska przeglądarki.
Wymagania dotyczące zapisu do schowka
Kiedy można bezpiecznie wywołać navigator.clipboard.writeText() w przeglądarce?
Podsumowanie lekcji: Clipboard API w React
Należy używać navigator.clipboard.writeText() wewnątrz procedury obsługi kliknięcia, aby kopiować tekst. Należy utworzyć hook useCopyToClipboard zwracający [copied, copyFn] z resetowaniem po określonym czasie. Zawsze należy sprawdzać dostępność API, zapewnić alternatywę opartą na execCommand dla starszych przeglądarek oraz zamockować navigator.clipboard w testach Jest.
Często zadawane pytania
Czy lekcja „Clipboard API: kopiowanie i wklejanie w React” jest bezpłatna?
Tak — pełny tekst „Clipboard API: kopiowanie i wklejanie w React” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Clipboard API: kopiowanie i wklejanie w React”?
Implementować przyciski kopiowania do schowka za pomocą nowoczesnego Clipboard API i zapewniać poprawne działanie w starszych przeglądarkach Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć React Academy?
Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Clipboard API: kopiowanie i wklejanie w React”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?
Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Clipboard API: kopiowanie i wklejanie w React
- Geolocation API w komponentach React
- Notifications API i obsługa uprawnień
- IntersectionObserver do efektów wyzwalanych przewijaniem