【问题标题】:Update state variable within Router更新路由器中的状态变量
【发布时间】:2021-10-21 06:33:09
【问题描述】:

我目前正在开发一个 React 站点,我有一个自定义的 HeaderBar 组件,我想在上面显示当前页面标题。我计划只从路由器更新一个状态变量来更改标题。但是,可以理解的是,这会导致“重新渲染过多”错误。

这是我当前的代码:

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 声明移动到每条路线中,但这对我来说似乎是一个骇人听闻的解决方案。

有没有更好的方法来解决这个问题?

【问题讨论】:

  • 创建布局组件并在路由中传递组件标题

标签: reactjs react-router use-state


【解决方案1】:

当在 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>
  );
}

【讨论】:

  • 非常聪明的解决方案!谢谢!
猜你喜欢
  • 2018-12-14
  • 2022-01-18
  • 1970-01-01
  • 2015-06-23
  • 2018-01-05
  • 2021-07-27
  • 2021-04-26
  • 2020-09-05
  • 2015-05-12
相关资源
最近更新 更多