0Pricing
React Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Clipboard API: копирование и вставка в React
  2. Geolocation API в компонентах React
  3. Notifications API и обработка разрешений
  4. IntersectionObserver для эффектов при прокрутке
← Назад к React Academy