Эта статья изначально была опубликована на React Toastify: полное руководство.

В этом руководстве мы начнем с основ создания всплывающих уведомлений и шаг за шагом перейдем к созданию сложных уведомлений и изучению всех возможностей библиотеки React Toastify.

Вот краткое изложение того, что мы собираемся узнать в этой статье.

  1. Что такое всплывающие уведомления?
  2. Что такое реакция Toastify?
  3. Установка реакции Toastify
  4. Создание основного всплывающего уведомления
  5. Типы всплывающих сообщений
  6. Настройка позиции всплывающего сообщения
  7. Пользовательский стиль с помощью HTML и CSS всплывающих сообщений
  8. Использование перехода и анимации
  9. Тост-сообщения на основе обещаний
  10. Обработка автозакрытия
  11. Строка рендеринга, число и компонент
  12. Установка пользовательских значков, использование встроенных значков и отключение значков
  13. Приостановить тост, когда окно теряет фокус
  14. Отложить тост-уведомление
  15. Реализация контролируемого индикатора выполнения
  16. Обновление всплывающего уведомления при возникновении события
  17. Пользовательская кнопка закрытия или удалить кнопку закрытия
  18. Переход к различным переходам
  19. Определение пользовательской анимации входа и выхода
  20. Перетащите, чтобы удалить

Если вы ищете JavaScript API и SDK для чата, DeadSimpleChat — это решение для вас.

Что такое всплывающие уведомления?

Уведомления Toast или Toastify — это всплывающие сообщения, которые обычно содержат некоторую информацию на боковой панели. Это может быть такая информация, как успех, загрузка, ошибка или предупреждение.

Там также может быть индикатор выполнения или нет. доступны различные всплывающие уведомления. Обратитесь к изображениям ниже для примера:

Что такое реагировать на тостирование?

React toastify — одна из самых популярных библиотек для создания всплывающих уведомлений в React.

С помощью react toastify вы можете легко создавать всплывающие уведомления и оповещения в своем реагирующем приложении.

Установка React Toastify

Чтобы установить React Toastify, сначала вам нужно приложение React. Вы можете легко добавить в свое реагирующее приложение или, если вы узнаете, вы можете создать новое реагирующее приложение с помощью create-react-app

Затем в вашем приложении для реагирования вы можете установить реакцию на toastify:

npm install --save react-toastify

с пряжей

yarn add react-toastify

Создание основного всплывающего уведомления

Создать базовое тост-уведомление очень просто. В вашем импорте файла App.Js реагируйте на тостирование и CSS-реагирование на тостирование, например:

import { ToastContainer, toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';

затем в вашей функции App() просто создайте уведомление

function App(){
	const notify = () => toast("This is a toast notification !");
	return (
	<div>
        <button onClick={notify}>Notify !</button>
        <ToastContainer />
      </div>
    )
}

Теперь мы научились создавать базовые всплывающие уведомления. Давайте теперь узнаем о некоторых свойствах всплывающих уведомлений, характеристиках стилей и доступных типах всплывающих уведомлений.

Типы всплывающих уведомлений

В React toastify доступно 5 предопределенных типов всплывающих уведомлений.

это:

  1. По умолчанию
  2. Информация
  3. успех
  4. предупреждение
  5. ошибка

Вот как выглядят эти четыре типа и как вы можете реализовать каждый из приведенных ниже типов:

Просто вызовите Toast Emitter с типом, который вы хотите реализовать

По умолчанию

const notify = () => toast("This is a toast notification !");

Это значение по умолчанию, поэтому здесь ничего вызывать не нужно. Полная функция выглядит так:

function Toastify(){
  const notify = () => toast.error("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
    <ToastContainer />
  </div>
  )

Информация

const notify = () => toast.info("This is a toast notification !");

Полная функция выглядит так

function Toastify(){
  const notify = () => toast.info("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
    <ToastContainer />
  </div>
  )
}

Успех

const notify = () => toast.success("This is a toast notification !");

полная функция выглядит

function Toastify(){
  const notify = () => toast.success("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
    <ToastContainer />
  </div>
  )
}

Предупреждение

const notify = () => toast.warning("This is a toast notification !");
function Toastify(){
  const notify = () => toast.warning("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
    <ToastContainer />
  </div>
  )
}

Ошибка

const notify = () => toast.error("This is a toast notification !");
function Toastify(){
  const notify = () => toast.error("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
    <ToastContainer />
  </div>
  )
}

Настройка положения всплывающего уведомления

Вы можете установить позицию уведомления Toast из множества предустановленных позиций, доступных в библиотеке react toastify.

доступные позиции:

  1. верхний левый
  2. в правом верхнем углу
  3. верхний центр
  4. Нижний левый
  5. Нижний правый
  6. нижний центр

Вот как выглядит позиционное уведомление в каждой из позиций и код для реализации позиции

Чтобы добавить настройку позиции, вам нужно отредактировать ToastContainer и установить свойство позиции, например

<ToastContainer
position="top-right" />

В нашем примере вы можете установить его как

function Toastify(){
  const notify = () => toast.error("This is a toast notification !");
  return (
    <div>
    <button onClick={notify}>Notify !</button>
	    <ToastContainer
    	position="top-right"
    	/>
  </div>
  )
}

вы можете установить другие настройки следующим образом:

<ToastContainer
position="top-left"
/>

<ToastContainer
position="top-right"
/>
    
<ToastContainer
position="top-center"
/>
    
<ToastContainer
position="bottom=left"
/>

<ToastContainer
position="bottom-right"
/>
    
<ToastContainer
position="bottom-center"
/>

Различные позиции выглядят так

верхний левый

в правом верхнем углу

верхний центр

Нижний левый

Нижний правый

нижний центр

Пользовательский стиль уведомления с помощью HTML и CSS

Вы можете настроить стиль всплывающего уведомления с помощью HTML и CSS, вот как вы можете настроить уведомление

Существует множество переменных CSS, которые доступны библиотеке react toastify. Вы можете переопределить их и выполнить настройку, которая будет работать для большинства людей.

Вот переменные, которые вы можете переопределить:

:root {
  --toastify-color-light: #fff;
  --toastify-color-dark: #121212;
  --toastify-color-info: #3498db;
  --toastify-color-success: #07bc0c;
  --toastify-color-warning: #f1c40f;
  --toastify-color-error: #e74c3c;
  --toastify-color-transparent: rgba(255, 255, 255, 0.7);

  --toastify-icon-color-info: var(--toastify-color-info);
  --toastify-icon-color-success: var(--toastify-color-success);
  --toastify-icon-color-warning: var(--toastify-color-warning);
  --toastify-icon-color-error: var(--toastify-color-error);

  --toastify-toast-width: 320px;
  --toastify-toast-background: #fff;
  --toastify-toast-min-height: 64px;
  --toastify-toast-max-height: 800px;
  --toastify-font-family: sans-serif;
  --toastify-z-index: 9999;

  --toastify-text-color-light: #757575;
  --toastify-text-color-dark: #fff;

  //Used only for colored theme
  --toastify-text-color-info: #fff;
  --toastify-text-color-success: #fff;
  --toastify-text-color-warning: #fff;
  --toastify-text-color-error: #fff;

  --toastify-spinner-color: #616161;
  --toastify-spinner-color-empty-area: #e0e0e0;

  // Used when no type is provided
  // toast("**hello**")
  --toastify-color-progress-light: linear-gradient(
    to right,
    #4cd964,
    #5ac8fa,
    #007aff,
    #34aadc,
    #5856d6,
    #ff2d55
  );
  // Used when no type is provided
  --toastify-color-progress-dark: #bb86fc;
  --toastify-color-progress-info: var(--toastify-color-info);
  --toastify-color-progress-success: var(--toastify-color-success);
  --toastify-color-progress-warning: var(--toastify-color-warning);
  --toastify-color-progress-error: var(--toastify-color-error);
}

Если изменения переменных недостаточно для вас. Вы можете переопределить существующий класс. Вот классы, которые вы можете легко переопределить

/** Used to define container behavior: width, position: fixed etc... **/
.Toastify__toast-container {
}

/** Used to define the position of the ToastContainer **/
.Toastify__toast-container--top-left {
}
.Toastify__toast-container--top-center {
}
.Toastify__toast-container--top-right {
}
.Toastify__toast-container--bottom-left {
}
.Toastify__toast-container--bottom-center {
}
.Toastify__toast-container--bottom-right {
}

/** Classes for the displayed toast **/
.Toastify__toast {
}
.Toastify__toast--rtl {
}
.Toastify__toast-body {
}

/** Used to position the icon **/
.Toastify__toast-icon {
}

/** handle the notification color and the text color based on the theme **/
.Toastify__toast-theme--dark {
}
.Toastify__toast-theme--light {
}
.Toastify__toast-theme--colored.Toastify__toast--default {
}
.Toastify__toast-theme--colored.Toastify__toast--info {
}
.Toastify__toast-theme--colored.Toastify__toast--success {
}
.Toastify__toast-theme--colored.Toastify__toast--warning {
}
.Toastify__toast-theme--colored.Toastify__toast--error {
}

.Toastify__progress-bar {
}
.Toastify__progress-bar--rtl {
}
.Toastify__progress-bar-theme--light {
}
.Toastify__progress-bar-theme--dark {
}
.Toastify__progress-bar--info {
}
.Toastify__progress-bar--success {
}
.Toastify__progress-bar--warning {
}
.Toastify__progress-bar--error {
}
/** colored notifications share the same progress bar color **/
.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,
.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,
.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,
.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error {
}

/** Classes for the close button. Better use your own closeButton **/
.Toastify__close-button {
}
.Toastify__close-button--default {
}
.Toastify__close-button > svg {
}
.Toastify__close-button:hover,
.Toastify__close-button:focus {
}

вы также можете создать свой собственный стиль, используя файл scss. Просто отредактируйте каталог scss и создайте собственную таблицу стилей.

Если вы просто хотите изменить некоторые цвета и тому подобное, вы можете легко сделать это, изменив некоторые переменные.

переменные определены в файле __variables.scss

Передача классов CSS компонентам

ToastContainer будет принимать следующие реквизиты для стилизации:

  1. className
  2. toastClassName
  3. bodyClassName
  4. ProgressClassName
  5. стиль
toast("Custom style", {
  className: "black-background",
  bodyClassName: "grow-font-size",
  progressClassName: "fancy-progress-bar",
});

Вот как вы можете настроить тост-уведомление

Использование переходов и анимации

Когда дело доходит до анимации, существуют миллионы способов анимировать тост-уведомление.

m и, конечно же, вы также можете создавать свои собственные анимации

Четыре доступных перехода:

  1. подпрыгивать
  2. горка
  3. зум
  4. подбросить

Вы можете использовать один из переходов по умолчанию, например

чтобы добавить переход по умолчанию, импортируйте переходы из react-toastify, а затем в ToastContainer добавьте переход, как показано выше.

Вы также можете реализовать переход для каждого тоста, чтобы у вас был разный переход для разных тостов.

Вместо ToastContainer добавьте настройку перехода в функцию тоста

import { Bounce, Slide, Zoom, ToastContainer, toast } from 'react-toastify';    
  const notify = () => toast.success("This is a toast notification !");

<ToastContainer
    transition={Zoom}
    />
  </div>
function Toastify(){
  const notify = () => toast.success("This is a toast notification !",{
    transition: Slide
  });

  return (
    <div>

    <button onClick={notify}>Notify !</button>

    <ToastContainer
    />
  </div>
  )
}

Для пользовательского перехода создайте собственный переход и импортируйте его в свой файл App.js, а затем используйте его в ToastContainer или функции всплывающего уведомления, как вы используете переход по умолчанию. нравиться

import { Bounce, Slide, Zoom, ToastContainer, toast } from 'react-toastify';    
  const notify = () => toast.success("This is a toast notification !");

<ToastContainer
    transition={yourCustomTransition}
    />
  </div>

Тост-сообщения на основе обещаний

Реакция toasitfy предоставляет функцию toast.promise. Вы можете добавить обещание или функцию, которая возвращает обещание.

Когда это обещание будет выполнено или не будет выполнено, уведомление будет соответствующим образом обновлено.

Когда обещание находится на рассмотрении, также отображается счетчик уведомлений.

function Toastify(){

  const resolveAfter2Seconds = new Promise(resolve => setTimeout(resolve, 2000))
  const notify = () => toast.promise(resolveAfter2Seconds, {
    pending: "waiting for the promise to resolve",
    success: "promise resolved successfully",
    error: "promise failed to resolve"
  });

  return (
    <div>

    <button onClick={notify}>Notify !</button>

    <ToastContainer
    />
  </div>
  )
}

Вот как вы можете создать всплывающее сообщение на основе обещания.

Отображение простого сообщения полезно в большинстве случаев. Для дополнительной интерактивности вы можете отобразить сообщение в соответствии с ответом на обещание.

Вы можете показать какое-то сообщение, если обещание успешно разрешается, или показать какое-то другое сообщение, если обещание не может быть разрешено, и даже показать сообщение, когда обещание находится в ожидании.

Вот как это можно реализовать:

function Toastify(){

  const notify = new Promise(resolve => setTimeout(() => resolve("this is soo cool"), 2000));
toast.promise(
    notify,
    {
      pending: {
        render(){
          return "Promise Pending"
        },
        icon: false,
      },
      success: {
        render({data}){
          return `Great, ${data}`
        },
        // other options
        icon: "👍",
      },
      error: {
        render({data}){
          // When the promise reject, data will contains the error
          return <MyErrorComponent message={data.message} />
        }
      }
    }
)
  return (
    <div>

    <button onClick={notify}>Notify !</button>

    <ToastContainer
    />
  </div>
  )
}

Обработка автоматического закрытия

Свойство autoClose всплывающего уведомления принимает продолжительность в миллисекундах или false.

import { ToastContainer, toast } from 'react-toastify';

//Close the toast after 2 seconds
    <ToastContainer
    autoClose={2000}
    />

Вы также можете индивидуально закрывать каждое всплывающее уведомление в разные моменты времени.

function Toastify(){

  
  const notify = () => toast("closeAfter10Seconds", {
  autoClose: 10000
  });

  const notify2 = () => toast("closeAfter2Seconds", {
    autoClose: 2000
    });

  return (
    <div>

    <button onClick={notify} >Notify !</button>
    <button onClick={notify2} >Notify2 !</button>

    <ToastContainer
    autoClose={2000}
    />
  </div>
  )
}

Вы также можете предотвратить закрытие всплывающего уведомления по умолчанию, используя оператор false вместо секунд, таких как

toast("hi",
	{
    autoClose: false
    });

Строка рендеринга, число и компонент

Вы можете визуализировать любой реагирующий узел, включая строку, число или даже компонент. Вот как вы можете это сделать

import React from "react";
import { ToastContainer, toast } from 'react-toastify';

const Data = ({closeToast, toastProps})=>{
  <div>
  Hi how are you? 
  {toastProps.position}
  <button>Retry</button>
  <button onClick={closeToast}>close</button>

</div>
}

function Toastify(){

  
  const notify = () => toast(
    <Data />
  );

  return (
    <div>

    <button onClick={notify} >Notify !</button>

    <ToastContainer
    />
  </div>
  )
}

Установка пользовательских значков, использование встроенных значков и отключение

В библиотеке toastify доступны встроенные значки, которые полезны в большинстве случаев, вы можете включить настраиваемые значки для своего приложения и, наконец, вы также можете удалить значки из самого всплывающего уведомления.

Для всех типов всплывающих уведомлений отображаются соответствующие значки, поэтому вы можете указать тип всплывающего уведомления и отобразить соответствующий значок.

Пользовательский значок

чтобы отобразить собственный значок, просто укажите тип всплывающего уведомления с помощью значка, например, так

//you can use a string
toast.success("custom toast icons". {
              icon: "👍"
});

//or a component
toast.success("custom toast icons". {
              icon: CustomIcon
});
// or a function
toast.success("custom toast icons". {
              icon: ({theme,type}) => <img src="url"/>
});

Пауза taost, когда окно теряет фокус

Поведение всплывающего уведомления по умолчанию — пауза всякий раз, когда окно теряет фокус. Но вы можете настроить его так, чтобы он не приостанавливался, установив для свойства pauseOnFocusLoss значение false, например

//All all toasts
<ToastContainer pauseOnFocusLoss={false} />

// for individual toasts
toast('cool', {
  pauseOnFocusLoss: false
})

Отложить тост-уведомление

Чтобы отложить отображение уведомлений, вы можете использовать setTimeout или использовать hte delay prop, который использует setTimeout под капотом.

toast('cool')
toast('how are you?', {delay: 1000});

Ограничьте количество отображаемых тостов

Уведомление может быть удобным, но может отображаться несколько уведомлений.

Вы можете ограничить количество отображаемых уведомлений с помощью параметра limit

import React from 'react';
import { toast, ToastContainer } from 'react-toastify';

import 'react-toastify/dist/ReactToastify.css';

// Display a maximum of 3 notifications at the same time
function App(){
  const notify = () => {
    toast("lorem ipsum");
  }

  return (
    <div>
      <button onClick={notify}>Click on me a lot!</button>
      <ToastContainer limit={3}>
    </div>
  )
}

Когда количество отображаемых всплывающих уведомлений достигает предела, оставшиеся всплывающие уведомления добавляются в очередь, а затем отображаются всякий раз, когда доступен слот.

Вы также можете очистить очередь, чтобы очистить очередь, чтобы больше не отображались тосты, используйте метод clearWaitingQueue()

toast.clearWaitingQueue();

Реализация контролируемого индикатора выполнения

Если вы программируете загрузку файла или что-то еще, где вам нужно указать ход выполнения программы, тогда может пригодиться контролируемый индикатор выполнения, указывающий, что этот процесс

Давайте посмотрим на пример, где мы загружаем файл на сервер, и индикатор выполнения будет загружаться по мере загрузки файла.

import React from 'react';
import axios from 'axios';
import { toast } from 'react-toastify';

function demoOfProgressBar(){
  // Keeping a reference of the toast id
  const toastId = React.useRef(null);

  function uploadFiles(){
    axios.request({
      method: "post", 
      url: "/cool", 
      data: informationToBeUploaded, 
      onUploadProgress: p => {
        const progress = p.loaded / p.total;

        // see if the toast is being displayed
        if (toastId.current === null) {
          toastId.current = toast('Uploading', { progress });
        } else {
          toast.update(toastId.current, { progress });
        }
      }
    }).then(data => {
      //When the upload is done the progress bar will close and the transition will end
      toast.done(toastId.current);
    })
  }

  return (
    <div>
      <button onClick={uploadFiles}>Upload files to server</button>
    </div>
  )
}

Обновление всплывающего уведомления, когда происходит событие

Вы можете обновить всплывающее уведомление, когда происходит событие. Например, если вы загружаете файл на сервер, вы можете обновить всплывающее уведомление, когда загрузка завершена.

Что можно обновить

  1. Измените тип всплывающего уведомления или измените цвет или тему
  2. Изменить содержание всплывающего уведомления
  3. Примените переход, когда произойдет изменение

Давайте посмотрим на это с примерами в действии

1. Измените тип тоста или измените цвет или тему.

import React from 'react';
import { toast } from 'react-toastify';

function changeToast() {
  const toastId = React.useRef(null);

  const notify = () => toastId.current = toast("this is soo cool", { autoClose: false });

  const updateToast = () => toast.update(toastId.current, { type: toast.TYPE.INFO, autoClose: 2000 });

  return (
    <div>
      <button onClick={notify}>Notify</button>
      <button onClick={updateToast}>Update</button>
    </div>
  );
}

2. Измените содержание всплывающего уведомления

Изменить содержание тоста также легко. Просто передайте любой допустимый элемент или даже реагирующий компонент.

В приведенных ниже примерах я покажу, как визуализировать строку, а также компонент для изменения всплывающего уведомления в действии.

// With a string
 toast.update(toastId, {
    render: "New content",
    type: toast.TYPE.INFO,
    autoClose: 5000
  });

// Or with a component
toast.update(toastId, {
    render: MyComponent
    type: toast.TYPE.INFO,
    autoClose: 5000
});

toast.update(toastId, {
    render: () => <div>New content</div>
    type: toast.TYPE.INFO,
    autoClose: 5000
});

3. Примените переход, когда произойдет изменение

Если вы хотите применить переход, когда происходит изменение, вы можете использовать свойство className или transition для достижения этого.

toast.update(toastId, {
  render: "stuff",
  type: toast.TYPE.INFO,
  transition: Zoom
})

Пользовательская кнопка закрытия или удалить кнопку закрытия

Вы можете передать пользовательскую кнопку закрытия контейнеру тостов и переопределить кнопку по умолчанию.

Вот как вы можете это сделать.

import React from 'react';
  import { toast, ToastContainer } from 'react-toastify';

  const CloseButton = ({ closeToast }) => (
    <i
      className="fastly-buttons"
      onClick={closeToast}
    >
    delete
    </i>
  );

function App() {
  const notify = () => {
    toast("this is a toast notification");
  };

  return (
    <div>
      <button onClick={notify}>Notify</button>;
      <ToastContainer closeButton={CloseButton} />
    </div>
  );
}

Вот как вы можете определить его для каждого тоста

toast("this is a toast notification", {
  closeButton: CloseButton
})

Вы также можете удалить его глобально и показать его для каждого всплывающего уведомления или показать его глобально и скрыть для каждого всплывающего уведомления, например:

toast("this is a toast notification", {
  closeButton: true
})

//hide it per toast and show globally
toast("this is a toast notification", {
  closeButton: false
})

Добавление действия «Отменить» во всплывающие сообщения

Вы можете добавить кнопку отмены к всплывающим сообщениям. Например, если кто-то выполнил действие, которое он хочет отменить, он может легко отменить действие, нажав кнопку отмены.

Перетащите, чтобы удалить

вы можете перетащить тост, чтобы удалить его. Вам нужно определить процент ширины, чтобы удалить тост. Вы также можете отключить перетаскивание для удаления.

установить процент перетаскивания при удалении всплывающего уведомления

передайте реквизиты draggablepercent с процентом экрана, который необходимо перетащить, чтобы удалить тост, следующим образом

<toastContainer draggablePercent={50} />
toast('Cool',{
    draggablePercent: 90
})

Чтобы отключить возможность перетаскивания для закрытия, передайте свойство false to draggable.

<ToastContainer draggable={false} />

Вы можете отключить всплывающее уведомление следующим образом.

toast('Cool',{
    draggable: false
})

Вот как вы можете включить перетаскивание для удаления в ответном уведомлении Toastify.