Вы можете создать контекст, который обеспечивает легкий доступ к предупреждению в любом месте приложения.
AlertProvider.js
import React, { useState, useCallback, useContext, createContext } from 'react'
const AlertContext = createContext()
export function AlertProvider(props) {
const [open, setOpen] = useState(false)
const [message, setMessage] = useState()
const handleClose = useCallback(() => {
setOpen(false)
}, [setOpen])
const handleOpen = useCallback(message => {
setMessage(message)
setOpen(true)
}, [setMessage, setOpen])
return (
<AlertContext.Provider value={[handleOpen, handleClose]}>
{props.children}
<Alert color="info" isOpen={open} toggle={handleClose} >
{message}
</Alert>
</AlertContext.Provider>
)
}
export function useAlert() {
const context = useContext(AlertContext);
if (!context)
throw new Error('`useAlert()` must be called inside an `AlertProvider` child.')
return context
}
Обновите App.js
import { Alert } from 'reactstrap';
import { AlertProvider } from './AlertProvider';
function App() {
return (
<AlertProvider>
<Router>
<div className="App">
<nav className="navbar navbar-expand-lg navbar-light fixed-top">
<div className="container">
<Link className="navbar-brand" to={"/add"}>
Chicommons
</Link>
<NavBar />
</div>
</nav>
<div className="auth-wrapper">
<div className="auth-inner">
<Switch>
<Route exact path="/" component={Add} />
<Route path="/add" component={Add} />
<Route path="/edit/:id" component={Edit} />
<Route path="/search" component={Search} />
<Route path="/:coop_id/people" component={AddPerson} />
<Route path="/:coop_id/listpeople" component={ListPeople} />
</Switch>
</div>
</div>
</div>
</Router>
</AlertProvider>
);
}
export default App;
Затем вы можете использовать это в функциональных компонентах:
import React, { useEffect } from 'react'
import { useAlert } from './AlertProvider'
function MyComponent() {
const [open, close] = useAlert();
useEffect(() => {
// when some condition is met
open("Hi") // closable with the toggle, or in code via close()
})
}
Здесь используется повелительное настроение открывать и закрывать, вызывая open()
и close()
. Если вам нужен декларативный настрой, контекст должен вместо этого напрямую возвращать функции setMessage
и setOpen
.
Вы также можете поэкспериментировать, чтобы разместить компонент предупреждения в другом месте.