---
localeCode: en-US
order: 70
category: Feedback
title: Toast
subTitle: Toast
icon: doc-toast
width: 65%
brief: Toast component is used to give timely feedback to user's operations. It could be the result feedback of the operation, such as success, failure, error, warning, etc.
---
## Demos
### How to import
```jsx
import { Toast } from '@douyinfe/semi-ui';
```
### Basic Usage
```jsx live=true noInline=true
import React from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
import { throttle } from 'lodash-es';
function Demo() {
const opts = {
content: 'Hi, Bytedance dance dance',
duration: 3,
};
const handleClose = () => {
throttled.cancel();
};
const throttleOpts = {
content: 'Hi, Bytedance dance dance',
duration: 10,
onClose: handleClose,
};
const throttled = throttle(() => Toast.info(throttleOpts), 10000, { trailing: false });
return (
);
}
render(Demo);
```
### Other Types
Use different methods to show different Toast including success, warning, error and info.
```jsx live=true noInline=true
import React from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
function Demo() {
let opts = {
content: 'Hi, Bytedance dance dance',
duration: 3,
};
return (
<>
>
);
}
render(Demo);
```
### Colored Background
You could use `theme` for a colored background style. Default is `normal`.
```jsx live=true noInline=true
import React from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
function Demo() {
let opts = {
content: 'Hi, Bytedance dance dance',
duration: 3,
theme: 'light',
};
return (
<>
>
);
}
render(Demo);
```
### Custom Children with Link
Informational feedback
```jsx live=true noInline=true
import React from 'react';
import { Toast, Typography, Button } from '@douyinfe/semi-ui';
function Demo() {
const { Text } = Typography;
let opts = {
content: (
Hi, Bytedance dance dance
More Info
),
duration: 3,
};
let multiLineOpts = {
content: (
<>
Hi, Bytedance dance dance
More Info
Later
>
),
duration: 3,
};
return (
<>
>
);
}
render(Demo);
```
### Delay
Use `duration` to set up time delay. By default it closes after 3 seconds.
```jsx live=true noInline=true hideInDSM
import React from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
function Demo() {
let opts = {
content: 'Hi, Bytedance dance dance',
duration: 10,
};
return ;
}
render(Demo);
```
### Manual Close
Set `duration` to 0 if you do not want the Notification to close by itself. In this case, it could only be closed manually.
```jsx live=true noInline=true hideInDSM
import React, { useState } from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
function Demo() {
const [toastId, setToastId] = useState();
function show() {
if (toastId) {
return;
}
let id = Toast.info(opts);
setToastId(id);
}
function hide() {
Toast.close(toastId);
destroy();
}
function destroy() {
setToastId(null);
}
let opts = {
content: 'Not auto close',
duration: 0,
onClose: destroy,
};
return (
<>
>
);
}
render(Demo);
```
### useToast Hooks
You could use `Toast.useToast` to create a `contextHolder` that could access context. Created toast will be inserted to where contextHolder is placed.
```jsx live=true noInline=true hideInDSM
import React from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
const ReachableContext = React.createContext();
function Demo(props = {}) {
const [toast, contextHolder] = Toast.useToast();
const config = {
duration: 0,
title: 'This is a success message',
content: {name => `ReachableContext: ${name}`},
};
return (
{contextHolder}
);
}
render(Demo);
```
You could also use `ReactDOM.createPortal` to insert toast in a Portal.
```jsx live=true noInline=true
import React, { useRef } from 'react';
import { Toast, Button } from '@douyinfe/semi-ui';
const ReachableContext = React.createContext();
const useCreatePortalInBody = () => {
const wrapperRef = useRef(null);
if (wrapperRef.current === null && typeof document !== 'undefined') {
const div = document.createElement('div');
wrapperRef.current = div;
}
useLayoutEffect(() => {
const wrapper = wrapperRef.current;
if (!wrapper || typeof document === 'undefined') {
return;
}
document.querySelector('.article-wrapper').appendChild(wrapper);
return () => {
document.querySelector('.article-wrapper').appendChild(wrapper);
};
}, []);
return children => wrapperRef.current && ReactDOM.createPortal(children, wrapperRef.current);
};
function Demo(props = {}) {
const [toast, contextHolder] = Toast.useToast();
const createBodyPortal = useCreatePortalInBody();
const config = {
duration: 3,
title: 'This is a success message',
content: {name => `ReachableContext: ${name}`},
};
return (
{createBodyPortal(
{contextHolder}
)}
);
}
render(Demo);
```
## API Reference
The static methods provided are as follows: Display: You can pass in `options` object or string directly. Methods return the value of `toastId`: `const toastId = Toast.info({ /*...options*/ })`
- `Toast.info(options || string)`
- `Toast.error(options || string)`
- `Toast.warning(options || string)`
- `Toast.success(options || string)`
Close Manually ( `toastId` is the return value of the display methods)
- `Toast.close(toastId)`
| Properties | Instructions | type | Default | version |
| --- | --- | --- | --- | --- |
| bottom | Pop-up position bottom | number \| string | - | 0.25.0 |
| content | Toast content | string | ReactNode | '' | |
| duration | Automatic close delay, no auto-close when set to 0 | number | 3 | |
| getPopupContainer | Specifies the parent DOM, and the bullet layer will be rendered to the DOM, you need to set container and inner .semi-toast-wrapper 'position: relative` | () => HTMLElement \| null | () => document.body | 0.34.0 |
| icon | Custom icons | ReactNode | | 0.25.0 |
| left | Pop-up position left | number \| string | - | 0.25.0 |
| right | Pop-up position right | number \| string | - | 0.25.0 |
| showClose | Toggle Whether show close button | boolean | true | 0.25.0 |
| textMaxWidth | Maximum width of content | number \| string | 450 | 0.25.0 |
| theme | Style of background fill, one of `light`, `normal` | string | `normal` | 1.0.0 |
| top | Pop-up position top | number \| string | - | 0.25.0 |
| zIndex | Z-index value | number | 1010 | |
| onClose | Callback function when closing toast | () => void | | |
The global configuration is set before any method call, and takes effect only once (>= 0.25.0):
- `Toast.config(config)`
| Properties | Instructions | type | Default | version |
| --- |-----------------------------------------------------------------------------------------------------------------------------------------------------------| --- | --- | --- |
| bottom | Bottom, absolute position | number \| string | - | 0.25.0 |
| duration | Automatic close delay, no auto-close when set to 0 | number(second) | 3 | 0.25.0 |
| getPopupContainer | Specifies the parent DOM, and the bullet layer will be rendered to the DOM, you need to set container and inner .semi-toast-wrapper 'position: relative` | () => HTMLElement \| null | () => document.body | 1.23.0 |
| left | Left, absolute position | number \| string | - | 0.25.0 |
| right | Right, absolute position | number \| string | - | 0.25.0 |
| top | Top, absolute position | number \| string | - | 0.25.0 |
| zIndex | Z-index | number | 1010 | 0.25.0 |
- `ToastFactory.create(config) => Toast`
If you need Toast with different configs in your application, you can use ToastFactory.create(config)to create a new Toast (>= 1.23):
```jsx live=true noInline=true
import React from 'react';
import { Button } from '@douyinfe/semi-ui';
function Demo() {
const ToastInCustomContainer = ToastFactory.create({
getPopupContainer: () => document.getElementById('custom-toast-container'),
});
return (
custom container
);
}
render(Demo);
```
Globally Destroy (>= 0.25.0):
- `Toast.destroyAll()`
HookToast
- `Toast.useToast` **v>=1.2.0**
When you need access Context, you could use `Toast.useToast` to create a `contextHolder` and insert to corresponding DOM tree. Toast created by hooks will be able to access the context where `contextHolder` is inserted. Hook toast has following methods: `info`, `success`, `warning`, `error`, `close`.
## Accessibility
### ARIA
- The role of Toast is alert
## Content Guidelines
- Keep it simple
- Do not use periods at the end of sentences
- Explain using the noun + verb format
| ✅ Recommended usage | ❌ Deprecated usage |
| --- | --- |
| Language added | New language has been added successfully |
| Ticket transfer failed | Can't transfer ticket |
- Provide prompt message for action
- only provide one action
- Don't use actions like "read" like OK, Got it, Dismiss, Cancel
| ✅ Recommended usage | ❌ Deprecated usage |
| --- | --- |
| Ticket transfer failed Retry } /> | Ticket transfer failed Dismiss } /> |
## Design Tokens