如题基于EUI封装个《消息通知》组件
需求,一次调用全项目能用如果按原来的EUI组件,
每个页面想调用消息通知组件EuiGlobalToastList就得调用DOM跟方法,
比较麻烦现在需要封装成一句话调用马上能用比如:
message.success("操作成功", 2000, "内容文字");
message.warning("警告!");
message.danger("操作失败");
message.primary("普通消息");
以下简单说说怎么实现
先封装组件命名为WFToast(名字随意)
import React, { useState, forwardRef, useImperativeHandle } from 'react' import { generateId } from '../../utils' import { EuiGlobalToastList } from '@elastic/eui' const WFMessage = (props, ref) => { const [toasts, setToasts] = useState([]); const addToast = (title, time = 2000, type = "", text = "") => { let iconType = ""; let color = ""; switch(type){ case "warning": iconType = "help"; color = "warning"; break; case "danger": iconType = "alert"; color = "danger"; break; case "primary": iconType = "bell"; color = "primary"; break; default: iconType = "check"; color = "success"; }; setToasts([...toasts, { id: `toast_${generateId()}`, title: title, text, toastLifeTimeMs: time, iconType, // 图标: check 成功, help 警告, alert 危险(更多图标可参考EUI图标库) color // 类型: success, warning, danger, primary }]); } const removeToast = (removedToast) => { setToasts(toasts.filter((toast) => toast.id !== removedToast.id)) } useImperativeHandle(ref, () => ({addToast})); return ( <EuiGlobalToastList toasts={toasts} dismissToast={removeToast} toastLifeTimeMs={2000} /> ) } export default forwardRef(WFMessage);
在跟目录的index.js路由插入组件WFToast,要注意必须先用函数组件Message再包一层,因为WFToast组件需要用ref调用内部方法addToast(这部分涉及到hook)
饿死了,先发部分吧,明天有空再偷偷发剩下的。。。