我认为你正在以错误的方式看待这个问题。因此,在 React 中思考时,可组合性是第一大特征。标头是一个可重用的组件,可以放在任何你想要的地方!
以这种方式思考将为您提供多种选择。
假设您有几个为应用程序设计的页面路由。标题是任何使用它的页面的子组件!
function AppRouter() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about/">About</Link>
</li>
<li>
<Link to="/users/">Users</Link>
</li>
</ul>
</nav>
<Route path="/" exact component={Index} />
<Route path="/about/" component={About} />
<Route path="/users/" component={Users} />
</div>
</Router>
);
}
现在,在每个页面中,您需要标题,您可以在需要的地方引入标题组件。
export default function Index(){
return (
<React.Fragment>
<Header/>
<div> ... Index Content </div>
</React.Fragment>
);
}
export default function About(){
return (
<React.Fragment>
//I don't need a header here.
<div> ... Index Content </div>
</React.Fragment>
);
}
一种更优雅但更复杂的方法是引入高阶组件。这将使您在路由级别添加标题的意图更加明确!
function withHeader(Page){
return class extends React.Component {
render() {
// Wraps the input component in a container, without mutating it.
return (
<React.Fragment>
<Header/>
<Page {...this.props} />);
</React.Fragment>
}
}
}
function AppRouter() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about/">About</Link>
</li>
<li>
<Link to="/users/">Users</Link>
</li>
</ul>
</nav>
<Route path="/" exact component={withHeader(Index)} />
<Route path="/about/" component={About} />
<Route path="/users/" component={Users} />
</div>
</Router>
);
}