React Multi Page NavBar 重置其状态
React Multipage NavBar reseting its state
尝试使用 react-bootstrap 设置一个简单的导航栏,我想保持活动页面的状态,这是组件:
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
,但是当页面加载,因此状态不会跨页面加载保留,而是每次都会重置。
我是 React 新手,已经尝试转到其他帖子和 React-bootstrap 文档。如果我更改 href 值以保留在同一页面中(例如通过设置 href="#explora"),一切都会按预期进行。
为了让 React 跨页面路由在 NavBar 中保持状态,我在这里缺少什么?
您可以使用 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;
您是否尝试将 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;
尝试使用 react-bootstrap 设置一个简单的导航栏,我想保持活动页面的状态,这是组件:
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
,但是当页面加载,因此状态不会跨页面加载保留,而是每次都会重置。
我是 React 新手,已经尝试转到其他帖子和 React-bootstrap 文档。如果我更改 href 值以保留在同一页面中(例如通过设置 href="#explora"),一切都会按预期进行。
为了让 React 跨页面路由在 NavBar 中保持状态,我在这里缺少什么?
您可以使用 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;
您是否尝试将 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;