--- localeCode: zh-CN order: 68 category: 反馈类 title: Toast 提示 icon: doc-toast width: 65% brief: Toast 提示是对用户的操作做出及时反馈,由用户的操作触发,反馈信息可以是操作的结果状态,如成功、失败、出错、警告等。 --- ## 代码演示 ### 如何引入 ```jsx import import { Toast } from '@douyinfe/semi-ui'; ``` ### 普通提示 信息提醒反馈 ```jsx live=true noInline=true import React from 'react'; import { throttle } from 'lodash-es'; import { Toast, Button } from '@douyinfe/semi-ui'; 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); ``` ### 其他提示类型 包括成功、失败、警告 ```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); ``` ### 多色样式 可以使用 `theme` 设置浅色填充样式提高与界面的对比,默认为 '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); ``` ### 链接文本 配合 Typography 可以自定义链接文本,用来配合更复杂的场景的使用。 ```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 更多 ), duration: 3, }; let multiLineOpts = { content: ( <>
Hi, Bytedance dance dance
查看详情 一会再看
), duration: 3, }; return ( <>

); } render(Demo); ``` ### 修改延时 自定义时长 10s,默认时长为 3s ```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: 10, }; return ; } render(Demo); ``` ### 手动关闭 当 `duration` 设置为 0 时,toast 不会自动关闭,此时必须通过手动关闭。 ```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); ``` ### Hooks 用法 通过 Toast.useToast 创建支持读取 context 的 contextHolder。此时的 toast 会渲染在 contextHolder 所在的节点处。 ```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); ``` 如果需要渲染到 Portal 中可以使用 ReactDOM.createPortal 方法。 ```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 参考 组件提供的静态方法,使用方式和参数如下:展示:可以直接传入 `options` 对象或 `string`,返回值为`toastId`:`const toastId = Toast.info({ /*...options*/ })` - `Toast.info(options || string)` - `Toast.error(options || string)` - `Toast.warning(options || string)` - `Toast.success(options || string)` 手动关闭 ( `toastId` 为展示方法的返回值) - `Toast.close(toastId)` | 属性 | 说明 | 类型 | 默认值 | 版本 | | --- |------------------------------------------------------------------------------------------| --- | --- | --- | | bottom | 弹出位置 bottom | number \| string | - | 0.25.0 | | content | 提示内容 | ReactNode | '' | | | duration | 自动关闭的延时,单位 s,设为 0 时不自动关闭 | number | 3 | | | getPopupContainer | 指定父级 DOM,弹层将会渲染至该 DOM 中,自定义需要设置 container 和 内部的 .semi-toast-wrapper `position: relative` | () => HTMLElement \| null | () => document.body | 0.34.0 | | icon | 自定义图标 | ReactNode | | 0.25.0 | | left | 弹出位置 left | number \| string | - | 0.25.0 | | right | 弹出位置 right | number \| string | - | 0.25.0 | | showClose | 是否展示关闭按钮 | boolean | true | 0.25.0 | | textMaxWidth | 内容的最大宽度 | number \| string | 450 | 0.25.0 | | theme | 填充样式,支持 `light`, `normal` | string | `normal` | 1.0.0 | | top | 弹出位置 top | number \| string | - | 0.25.0 | | zIndex | 弹层 z-index 值 | number | 1010 | | | onClose | toast 关闭的回调函数 | () => void | | | 全局配置在调用前提前配置,全局一次生效 ( >= 0.25.0 ): - `Toast.config(config)` | 属性 | 说明 | 类型 | 默认值 | 版本 | | --- | --- | --- | --- | --- | | bottom | 弹出位置 bottom | number \| string | - | 0.25.0 | | duration | 自动关闭的延时,单位 s,设为 0 时不自动关闭 | number | 3 | 0.25.0 | | getPopupContainer | 指定父级 DOM,弹层将会渲染至该 DOM 中,自定义需要设置 container 和 内部的 .semi-toast-wrapper `position: relative` | () => HTMLElement \| null | () => document.body | 1.23.0 | | left | 弹出位置 left | number \| string | - | 0.25.0 | | right | 弹出位置 right | number \| string | - | 0.25.0 | | top | 弹出位置 top | number \| string | - | 0.25.0 | | zIndex | 弹层 z-index 值 | number | 1010 | 0.25.0 | - `ToastFactory.create(config) => Toast` 如果您的应用中需要使用不同 config 的 Toast,可以使用 ToastFactory.create(config)创建新的 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); ``` 全局销毁 ( >= 0.25.0 ): - `Toast.destroyAll()` HookToast ( >= 1.2.0 ): - `Toast.useToast()` 当你需要使用 Context 时,可以通过 Toast.useToast 创建一个 contextHolder 插入相应的节点中。此时通过 hooks 创建的 Toast 将会得到 contextHolder 所在位置的所有上下文。创建的 toast 对象拥有与以下方法:`info`, `success`, `warning`, `error`, `close`。 ## Accessibility ### ARIA - Toast 的 role 为 alert ## 设计变量