Clipboard API: копирование и вставка в React
Реализуйте кнопки копирования в буфер обмена с помощью современного Clipboard API и корректно используйте запасной вариант в старых браузерах
«Clipboard API: копирование и вставка в React» — бесплатный урок React Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Запись в буфер обмена
navigator.clipboard.writeText(text) записывает строку в системный буфер обмена и возвращает промис. Это современная замена устаревшему подходу с execCommand. Всегда используйте await для ожидания промиса и обрабатывайте возможное отклонение, например если пользователь запретил доступ к буферу обмена.
Чтение из буфера обмена
navigator.clipboard.readText() читает текущее содержимое буфера обмена как строку и также возвращает промис. Для чтения требуется разрешение clipboard-read, которое браузер предлагает пользователю предоставить. На практике в обычных приложениях React чтение из буфера обмена используется реже, чем запись.
Для записи в буфер обмена требуется действие пользователя
Браузеры требуют, чтобы clipboard.writeText вызывался только внутри обработчика действия пользователя, например события щелчка или нажатия клавиши. Вызов внутри useEffect или асинхронно после действия приведёт к ошибке безопасности. Всегда запускайте запись непосредственно из обработчика onClick.
Шаблон интерфейса копирования в буфер обмена
Стандартный шаблон выглядит так: пользователь нажимает кнопку копирования, обработчик вызывает navigator.clipboard.writeText(value), при успехе вы устанавливаете состояние copied в значение true, а кнопка на короткое время показывает галочку или метку «Скопировано!». После небольшой задержки кнопка возвращается в обычное состояние.
Создание хука useCopyToClipboard
Инкапсулируйте логику в хуке useCopyToClipboard, который возвращает кортеж: [copied, copyFn]. Логическое значение copied управляет уведомлением в интерфейсе, а copyFn принимает текст для копирования. Хук самостоятельно обрабатывает асинхронную запись и возможные ошибки, поэтому компоненты остаются простыми.
Сброс состояния copied
Внутри хука после успешного копирования вызовите setCopied(true) и запланируйте сброс с помощью setTimeout(() => setCopied(false), 2000). Сохраните идентификатор таймера и очистите его в функции очистки useEffect, чтобы предотвратить обновление состояния после размонтирования. Это позволяет избежать предупреждения «невозможно обновить состояние размонтированного компонента».
Устаревший запасной вариант с execCommand
Старые браузеры и страницы без HTTPS не поддерживают интерфейс буфера обмена. Устаревший запасной вариант создаёт временный textarea, устанавливает его значение, добавляет его в тело документа, вызывает document.execCommand('copy') и удаляет элемент. Этот подход синхронный и работает повсюду, хотя считается устаревшим.
Проверка доступности интерфейса буфера обмена
Перед использованием интерфейса буфера обмена проверьте: navigator.clipboard && typeof navigator.clipboard.writeText === 'function'. Если он недоступен, используйте устаревший подход с execCommand. Такая защитная проверка предотвращает ошибки выполнения в окружениях, где этот интерфейс не поддерживается.
Разрешение на чтение буфера обмена
Для чтения буфера обмена требуется разрешение пользователя через API разрешений. Текущее состояние можно запросить так: navigator.permissions.query({ name: 'clipboard-read' }) возвращает PermissionStatus со значением state — granted, denied или prompt. Браузер автоматически запросит разрешение при вызове readText().
Требование HTTPS
Интерфейс буфера обмена доступен только в защищённых контекстах — HTTPS или на локальном хосте. На страницах HTTP значение navigator.clipboard равно undefined. Это ограничение безопасности, поскольку содержимое буфера обмена может быть конфиденциальным. Всегда проверяйте доступность интерфейса перед обращением к его методам, чтобы избежать ошибок обращения к отсутствующему объекту.
Тестирование буфера обмена в jsdom
jsdom (используемый Jest) не реализует API буфера обмена. Имитируйте его в настройке тестов: Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(undefined) } }). Это позволяет проверить, что компонент вызывает writeText с правильным аргументом без настоящего браузерного окружения.
Требования к записи в буфер обмена
Когда в браузере безопасно вызывать navigator.clipboard.writeText()?
Итоги урока: API буфера обмена в React
Используйте navigator.clipboard.writeText() внутри обработчика нажатия, чтобы скопировать текст. Создайте хук useCopyToClipboard, возвращающий [copied, copyFn], со сбросом через заданный промежуток времени. Всегда проверяйте доступность API, предусмотрите запасной вариант с execCommand для старых браузеров и имитируйте navigator.clipboard в тестах Jest.
Часто задаваемые вопросы
Урок «Clipboard API: копирование и вставка в React» бесплатный?
Да — полный текст урока «Clipboard API: копирование и вставка в React» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Clipboard API: копирование и вставка в React»?
Реализуйте кнопки копирования в буфер обмена с помощью современного Clipboard API и корректно используйте запасной вариант в старых браузерах Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Clipboard API: копирование и вставка в React»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Clipboard API: копирование и вставка в React
- Geolocation API в компонентах React
- Notifications API и обработка разрешений
- IntersectionObserver для эффектов при прокрутке