【发布时间】:2020-08-13 01:51:18
【问题描述】:
我正在尝试使用钩子,但在使用来自 notistack 的 useSnackbar 钩子时出现以下错误。
Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
我的 App.js
<SnackbarProvider
anchorOrigin={{
vertical: 'top',
horizontal: 'center',
}}
>
<App />
</SnackbarProvider>
我的 SnackBar.js
const SnackBar = (message, severity) => {
const { enqueueSnackbar, closeSnackbar } = useSnackbar()
const action = key => (
<>
<Button
onClick={() => {
closeSnackbar(key)
}}
>
Dismiss
</Button>
</>
)
enqueueSnackbar(message, {
variant: severity,
autoHideDuration: severity === 'error' ? null : 5000,
action,
preventDuplicate: true,
TransitionComponent: Fade,
})
}
我的 demo.js 包含这个函数
const Demo = props => {
const showSnackBar = (message, severity) => {
SnackBar(message, severity)
}
}
如果我要调用 demo.js 中的钩子并将其作为参数传入,如下所示。有什么区别?为什么我不能在snackbar.js 中使用useSnackbar() 钩子?
const Demo = props => {
const showSnackBar = (message, severity) => {
SnackBar(enqueueSnackbar, closeSnackbar, message, severity)
}
}
【问题讨论】:
-
您的snackbar.js 似乎不是一个组件。你只能在组件内部使用钩子。
-
我明白了,在snackbar.js 中调用SnackBar 函数的最佳方式是什么?我应该从我调用它的任何组件传入 enqueueSnackbar 和 closeSnackbar 函数吗?
标签: reactjs react-hooks notistack