更新 Router 中的状态变量
Update state variable within Router
我目前正在 React 网站上工作,我有一个自定义 HeaderBar
组件,我想在上面显示当前页面标题。我原计划只从路由器更新一个状态变量来更改标题。但是,可以理解的是,这会导致“太多 re-renders”错误。
这是我当前的代码:
function App() {
const [pageTitle, setPageTitle] = useState("")
return (
<div>
<Router>
<HeaderBar siteTitle="My Website Name" pageTitle={pageTitle} />
<Switch>
<Route path="/login">
{setPageTitle("Login")}
<h1>Login Page</h1>
</Route>
<Route path="/main">
{setPageTitle("Main")}
<h1>Main Page</h1>
</Route>
<Route path="/about">
{setPageTitle("About")}
<h1>About Page</h1>
</Route>
</Switch>
</Router>
</div>
);
}
显然我可以将 HeaderBar
声明移动到每个路由中,但这对我来说似乎是一个 hackish 解决方案。
有没有更好的方法来解决这个问题?
在 JSX 中调用函数时,这些函数会在每个渲染器上执行,这将导致在每个渲染器上执行 3 setPageTitle
次调用(尽管在您的情况下,只有第一个 setPageTitle
将被调用从而导致太多更新,因为它会在调用第一个 setPageTitle
、更新状态、再次呈现和再次调用它之间循环。
理想情况下,如果您为每个路由定义组件,则需要在 return 语句之外调用 setPageTitle
(意味着在 JSX 之外,在渲染之前),这将导致setPageTitle
只有访问对应的路由才会被调用
为了在不为您的路线定义组件的情况下做到这一点,您可以执行以下操作:
function App() {
const [pageTitle, setPageTitle] = useState("")
return (
<div>
<Router>
<HeaderBar siteTitle="My Website Name" pageTitle={pageTitle} />
<Switch>
<Route path="/login" render={() => {
setPageTitle("Login");
return (<h1>Login Page</h1>);
}}>
</Route>
<Route path="/main" render={() => {
setPageTitle("Main");
return (<h1>Main Page</h1>);
}}>
</Route>
<Route path="/about" render={() => {
setPageTitle("About");
return (<h1>About Page</h1>);
}}>
</Route>
</Switch>
</Router>
</div>
);
}
我目前正在 React 网站上工作,我有一个自定义 HeaderBar
组件,我想在上面显示当前页面标题。我原计划只从路由器更新一个状态变量来更改标题。但是,可以理解的是,这会导致“太多 re-renders”错误。
这是我当前的代码:
function App() {
const [pageTitle, setPageTitle] = useState("")
return (
<div>
<Router>
<HeaderBar siteTitle="My Website Name" pageTitle={pageTitle} />
<Switch>
<Route path="/login">
{setPageTitle("Login")}
<h1>Login Page</h1>
</Route>
<Route path="/main">
{setPageTitle("Main")}
<h1>Main Page</h1>
</Route>
<Route path="/about">
{setPageTitle("About")}
<h1>About Page</h1>
</Route>
</Switch>
</Router>
</div>
);
}
显然我可以将 HeaderBar
声明移动到每个路由中,但这对我来说似乎是一个 hackish 解决方案。
有没有更好的方法来解决这个问题?
在 JSX 中调用函数时,这些函数会在每个渲染器上执行,这将导致在每个渲染器上执行 3 setPageTitle
次调用(尽管在您的情况下,只有第一个 setPageTitle
将被调用从而导致太多更新,因为它会在调用第一个 setPageTitle
、更新状态、再次呈现和再次调用它之间循环。
理想情况下,如果您为每个路由定义组件,则需要在 return 语句之外调用 setPageTitle
(意味着在 JSX 之外,在渲染之前),这将导致setPageTitle
只有访问对应的路由才会被调用
为了在不为您的路线定义组件的情况下做到这一点,您可以执行以下操作:
function App() {
const [pageTitle, setPageTitle] = useState("")
return (
<div>
<Router>
<HeaderBar siteTitle="My Website Name" pageTitle={pageTitle} />
<Switch>
<Route path="/login" render={() => {
setPageTitle("Login");
return (<h1>Login Page</h1>);
}}>
</Route>
<Route path="/main" render={() => {
setPageTitle("Main");
return (<h1>Main Page</h1>);
}}>
</Route>
<Route path="/about" render={() => {
setPageTitle("About");
return (<h1>About Page</h1>);
}}>
</Route>
</Switch>
</Router>
</div>
);
}