问题描述
我正在尝试使用MaterialUI的Snackbar编写HOC,以便能够在任何网络故障中显示错误。遇到错误,有人可以帮忙吗?
react-dom.development.js:14724未捕获的错误:无效的挂钩调用。挂钩只能在功能组件的主体内部调用。发生这种情况可能是由于以下原因之一:
- 您可能使用了不匹配的React和渲染器版本(例如React DOM)
- 您可能正在违反挂钩规则
- 您可能在同一应用中拥有多个React副本
import React from 'react'
import Snackbar from '@material-ui/core/Snackbar'
const SnackbarContext = React.createContext(null)
const withSnackbar = (OriginalComponent) => {
function componentWithSnackbarContext() {
const [state,setState] = React.useState({
open: false,message: 'Some network error occurred',})
const { open,message } = state
const handleNetworkFail = (messageText) => () => {
setState({ open: true,message: messageText })
}
const handleClose = () => {
setState({ ...state,open: false })
}
return (
<>
<SnackbarContext.Provider value={{ handleNetworkFail,handleClose }}>
<OriginalComponent />
</SnackbarContext.Provider>
<Snackbar
anchorOrigin={{ vertical: 'top',horizontal: 'center' }}
open={open}
onClose={handleClose}
message={message}
/>
</>
)
}
return componentWithSnackbarContext
}
export default withSnackbar
解决方法
lint规则假定以大写字母开头的函数是组件,而以小写字母开头的函数不是组件。解决方法是将componentWithSnackbarContext
更改为ComponentWithSnackbarContext