我经常碰到的一个情景是,数据库中的某些页面具有Header = false或Page Title = false。对此的一个好解决方案是使用Context。
import React, { createContext, useContext, useState, useEffect } from "react";
import { Switch, Route } from "react-router-dom";
const AppContext = createContext({});
const Header = () => {
const { headerActive } = useContext(AppContext);
if (!headerActive) {
return null;
}
return (
<header>I'm a header</header>
);
}
const PageWithHeader = () => {
const { setHeaderActive } = useContext(AppContext);
useEffect(() => {
setHeaderActive(true);
},[setHeaderActive]);
return (
<div>Page with header</div>
);
}
const PageWithoutHeader = () => {
const { setHeaderActive } = useContext(AppContext);
useEffect(() => {
setHeaderActive(false);
},[setHeaderActive]);
return (
<div>Page without header</div>
);
}
export const App = () => {
const [headerActive, setHeaderActive] = useState(true);
return (
<AppContext.Provider value={{ headerActive, setHeaderActive }}>
<Header />
<Switch>
<Route path="page-1">
<PageWithHeader />
</Route>
<Route path="page-2">
<PageWithoutHeader />
</Route>
<Switch>
</AppContext.Provider>
);
}
您还可以通过使用自定义钩子来进一步简化它。例如:
export const useHeader = (active) => {
const { headerActive, setHeaderActive } = useContext(AppContext);
useEffect(() => {
if (active !== undefined) {
setHeaderActive(active);
}
},[setHeaderActive, active]);
return headerActive;
}
然后在原始组件中:
const Header = () => {
const headerActive = useHeader();
if (!headerActive) {
return null;
}
return (
<header>I'm a header</header>
);
}
...
const PageWithoutHeader = () => {
useHeader(false);
return (
<div>Page without header</div>
);
}
你还可以使用 useLocation 钩子和 useRef 配对,以跟踪先前和当前的路径名,这样你就可以拥有一个默认状态,而无需在每个页面中声明 useHeader,让你的代码更加优雅。
Route
的解释。 - flppvpath="*"
,尽管它似乎有点多余。 - JonShipman