【发布时间】:2021-02-21 13:04:24
【问题描述】:
我正在使用 material-ui Snackbar 创建我的反应应用程序。
在我的项目中,我有很多组件,不想在每个组件中插入
类似:
从 'SnackbarUtils' 导入 showSnackbar;
showSnackbar('成功消息');
【问题讨论】:
标签: javascript reactjs notifications material-ui snackbar
我正在使用 material-ui Snackbar 创建我的反应应用程序。
在我的项目中,我有很多组件,不想在每个组件中插入
类似:
从 'SnackbarUtils' 导入 showSnackbar;
showSnackbar('成功消息');
【问题讨论】:
标签: javascript reactjs notifications material-ui snackbar
你必须以反应的方式来做。您可以通过创建高阶组件来实现此目的。
看看这个。 https://stackblitz.com/edit/snackbar-hoc?file=src/SnackbarHOC.js
【讨论】:
把它扩展成一个Hook,然后你可以调用一次,用state with effects来展示:
import { useSnackbar } from 'notistack';
import IconButton from "@mui/material/IconButton";
import CloseIcon from "@mui/material/SvgIcon/SvgIcon";
import React, {Fragment, useEffect, useState} from "react";
const useNotification = () => {
const [conf, setConf] = useState({});
const { enqueueSnackbar, closeSnackbar } = useSnackbar();
const action = key => (
<Fragment>
<IconButton onClick={() => { closeSnackbar(key) }}>
<CloseIcon />
</IconButton>
</Fragment>
);
useEffect(()=>{
if(conf?.msg){
let variant = 'info';
if(conf.variant){
variant = conf.variant;
}
enqueueSnackbar(conf.msg, {
variant: variant,
autoHideDuration: 5000,
action
});
}
},[conf]);
return [conf, setConf];
};
export default useNotification;
然后就可以使用了:
const [msg, sendNotification] = useNotification();
sendNotification({msg: 'yourmessage', variant: 'error/info.....'})
【讨论】: