React Multi Page NavBar 重置其状态

Posted

技术标签:

【中文标题】React Multi Page NavBar 重置其状态【英文标题】:React Multipage NavBar reseting its state 【发布时间】:2021-08-10 05:02:37 【问题描述】:

尝试使用react-bootstrap设置一个简单的NavBar,我想保持活动页面的状态,这是组件:

    import React,  useState  from 'react';
    import  Navbar, Nav  from 'react-bootstrap';
    
    const Navigation = () => 
        const [activeItem, setActivePage] = useState("initial");
        return (
            <>
                <Navbar bg="primary" variant="dark">
                    <Navbar.Brand href="/page1">Navbar</Navbar.Brand>
                    <Nav activeKey=activeItem onSelect=(e) => setActivePage(e) className="mr-auto">
                        <Nav.Link eventKey="/page1"  href="/page1">Page 1</Nav.Link>
                        <Nav.Link eventKey="/page2"  href="/page2">Page 2</Nav.Link>
                    </Nav>
                    <p>current: activeItem</p>
                </Navbar>
            </>
        )
    
    export default Navigation;

这是主要的 App.js:

import React from 'react';
import  BrowserRouter as Router, Route, Switch  from 'react-router-dom';
import Navigation from './components/Navigation';

import Page1 from './routes/Page1';
import Page2 from './routes/Page2';

const App = () => (
  <>
    <Router>
       <Navigation/>
        <Switch>
          <Route exact path="/page1" component=Page1/>
          <Route  path="/page2" component=Page2/>
        </Switch>
    </Router>
  </>
);

export default App;

我遇到的问题是activeItem 状态变量在每次页面加载时都会被重置。所以activeItem一开始就是"initial",当我点击一个页面时,它会短暂地变为正确的eventKey,但当页面加载时立即返回到"initial",因此在页面加载时不会保留状态,但每次都会重置。

我是 react 新手,已经尝试过其他帖子和 react-bootstrap 文档。如果我将 href 值更改为保持在同一页面中(例如,通过设置 href="#explora"),一切都会按预期工作。

我在这里缺少什么来使导航栏中的反应保持状态跨页面路由?

【问题讨论】:

【参考方案1】:

您是否尝试将const [activeItem, setActivePage] = useState("initial"); 移动到 App.js 文件中?

App.js:

import React,  useState  from 'react';
import  BrowserRouter as Router, Route, Switch  from 'react-router-dom';
import Navigation from './components/Navigation';

import Page1 from './routes/Page1';
import Page2 from './routes/Page2';

const App = () => (
  const [activeItem, setActiveItem] = useState('initial');
  
  <>
    <Router>
       <Navigation 
        activeItem=activeItem 
        setActiveItem=setActiveItem
       />
        <Switch>
          <Route exact path="/page1" component=Page1/>
          <Route  path="/page2" component=Page2/>
        </Switch>
    </Router>
  </>
);

export default App;

导航组件:

import React,  useState  from 'react';
import  Navbar, Nav  from 'react-bootstrap';

const Navigation = ( activeItem, setActivePage ) => 
  return (
      <>
        <Navbar bg="primary" variant="dark">
            <Navbar.Brand href="/page1">Navbar</Navbar.Brand>
            <Nav activeKey=activeItem onSelect=(e) => setActivePage(e) className="mr-auto">
                <Nav.Link eventKey="/page1"  href="/page1">Page 1</Nav.Link>
                <Nav.Link eventKey="/page2"  href="/page2">Page 2</Nav.Link>
            </Nav>
            <p>current: activeItem</p>
        </Navbar>
      </>
  )

export default Navigation;

【讨论】:

这似乎不起作用,行为相同,页面加载时状态恢复为默认值。【参考方案2】:

您可以使用useLocation 挂钩检查位置对象,pathname 属性包含当前页面的路径,并且使用这种方法您不需要将当前页面保存在任何状态。因此,您的Navigation 组件应该如下所示:

import React,  useState  from 'react';
import  useLocation  from 'react-router-dom';
import  Navbar, Nav  from 'react-bootstrap';

const Navigation = () => 
  const location = useLocation();

  return (
    <>
      <Navbar bg="primary" variant="dark">
        <Navbar.Brand href="/page1">Navbar</Navbar.Brand>
        <Nav activeKey=location.pathname className="mr-auto">
          <Nav.Link href="/page1">Page 1</Nav.Link>
          <Nav.Link href="/page2">Page 2</Nav.Link>
        </Nav>
        <p>current: location.pathname</p>
      </Navbar>
    </>
  )


export default Navigation;

【讨论】:

Tx,不起作用抛出:“错误:无效的钩子调用。只能在函数组件的主体内部调用钩子。” 也许你的包版本有冲突。这是一个可以帮助你的指南reactjs.org/warnings/invalid-hook-call-warning.html 1) 检查的 react-dom 版本正常 (17.0) 2) 违反规则,不知道如何检查建议的解决方案是否符合规则,虽然看起来很好 3) React 不重复 终于搞定了,我重新安装了react-router-dom,现在可以工作了,非常感谢您的帮助

以上是关于React Multi Page NavBar 重置其状态的主要内容,如果未能解决你的问题,请参考以下文章

React Page 在根据 redux 值重定向之前闪烁

如果路径在 Route React 中是动态的,如何重定向到“/”

react-router-dom之Redirect(重定向)理解

无法解析模块 react-native-navbar

React.Js 将道具从组件传递到 NavBar 组件?

react js中的多级下拉菜单不可用还是啥?像 react-bootstrap