I have a Page
component that is rendered within App
using </Outlet>
. Within the Page
component I would like to use a state (a simple text provided via search input
) which is set in App
.
I was able to send and receive the state during Page
mounting via navigate("/page", { state: { searchQuery } });
executed from App
, but unfortunately this approach failed when the state of searchQuery
changed.
Is there a simple mechanism which will allow Page
to listen to the changes of App selectQuery
state in React Router v6 and if so what's the solution?
// index.tsx
const router = createBrowserRouter(
createRoutesFromElements(
<Route path="/" element={<App />}>
<Route path="page" element={<Page />}></Route>
</Route>
)
);
// App.tsx
function App() {
const [searchQuery, setSearchQuery] = useState<string>("");
return (
// ...
<AppBar component="nav">
// Input text field which sets setSearchQuery onChange
</AppBar>
// ...
<Outlet />
// ...
}
// Page.tsx
function Page() {
//...
return (
// ...
// usage of a App searchQuery
// ...
}
CodePudding user response:
You can do that using outlet context:
function App() {
const [searchQuery, setSearchQuery] = useState<string>("");
return (
// ...
<AppBar component="nav">
// Input text field which sets setSearchQuery onChange
</AppBar>
// ...
<Outlet context={searchQuery}>
// ...
)
}
import { useOutletContext } from 'react-router-dom';
function Page() {
const searchQuery = useOutletContext();
return (
// ...
// usage of a App searchQuery
// ...
)
}
For more information, see this documentation: https://reactrouter.com/en/6.8.0/hooks/use-outlet-context