reactjs 如何访问React路由器中的历史堆栈?

xggvc2p6  于 2023-01-08  发布在  React
关注(0)|答案(3)|浏览(876)

我正在尝试访问React路由器的历史堆栈。
下面是我想做的:
我使用react.js和react-router创建了一个讨论板。
如果用户单击图板上的某个列表,则会转到详细信息页面。
假设用户点击列表中id为3的文章,react-router会转到id为3的文章的详细页面,URL表单将在下面。

  1. localhost:3000/board/3

在详细信息页面中,有转到列表按钮,当用户单击它时,页面将再次移动到列表页面,我将在这里使用history. back()
到目前为止,使用react-router很容易实现。
然而,还有另一个页面,用户可以访问详细信息页面,让我们说配置文件页面。
如果用户通过配置文件页面访问详细信息页面,转到列表按钮的行为应该不同。它将用户推到用户列表页面。
综上所述,转到列表按钮的工作原理如下:

  1. board -> detail -> click go to the list -> board
  2. profile -> detail -> click go to the list -> user-list

为了根据用户所在的位置将用户推到不同的页面,我需要查看用户来自哪里,因此我需要查看历史堆栈,或者有没有其他方法可以检查用户来自哪个URL?

iklwldmw

iklwldmw1#

使用react-router-dom,您将无法直接访问浏览器的历史对象(即历史堆栈),但您不一定需要这样做,因为您可以使用路由状态来发送“ meta”数据沿着关于用户从何处导航的路由转换。
Link to: object
对于示例路由:<Route path="/detail">....</Route>您可以有多个指向页面的链接,每个链接提供唯一的状态。
示例链接:

  1. <Link
  2. to={{
  3. pathname: '/details',
  4. state: {
  5. from: 'board',
  6. }
  7. }}
  8. >
  9. to details from board
  10. </Link>

  1. <Link
  2. to={{
  3. pathname: '/details',
  4. state: {
  5. from: 'profile',
  6. }
  7. }}
  8. >
  9. to details from profile
  10. </Link>

或用于命令式导航

  1. history.push({
  2. pathname: '/details',
  3. state: {
  4. from: 'profile',
  5. }
  6. });

路由状态放置在location对象上,访问Details组件中的路由状态,并相应地发出后续导航。

  1. const targets = {
  2. board: "/board",
  3. profile: "/userlist",
  4. };
  5. ...
  6. const { state: { from } } = useLocation();
  7. const target = targets[from] ?? "/board";
  8. ...
  9. <Link to={target}>
  10. click go to the list
  11. </Link>

或用于命令式导航

  1. history.push(target)
展开查看全部
6qfn3psc

6qfn3psc2#

历史/ useHistory在React路由器v6中不再可用。您可以使用useNavigate和位置状态属性来确定从何处导航到当前位置。如here中所述。
告诉下一个页面用户来自哪里,并对用户界面进行分支。这里最流行的实现是,如果用户在网格视图中点击了某个项目,则以模态显示记录,但如果用户直接显示到URL,则以其自己的布局显示记录(pinterest,旧的instagram)。
您可以通过两种方式设置位置状态:在链接组件上或导航:

  1. <Link to="/pins/123" state={{ fromDashboard: true }} />;
  2. let navigate = useNavigate();
  3. navigate("/users/123", { state: partialUser });

在下一页中,您可以使用useLocation访问它:

  1. let location = useLocation();
  2. location.state;

浏览器后退操作可以使用执行

  1. let navigate = useNavigate();
  2. ...
  3. navigate(-1)
展开查看全部
6l7fqoea

6l7fqoea3#

在我们的导航中,我们传递历史记录(代码块1)。在基于函数的组件中,我们将拥有完整的历史记录堆栈(代码块2)。请参考URL了解更多详细信息。
网址:https://v5.reactrouter.com/web/api/history

代码块1

  1. <Navbar.Collapse id='basic-navbar-nav'>
  2. <Route render={({ history }) => <SearchBox history={history} />} />
  3. <Nav className='ml-auto'>
  4. <LinkContainer to='/cart'>
  5. <Nav.Link>
  6. <i className='fas fa-shopping-cart'></i> Cart
  7. </Nav.Link>
  8. </LinkContainer>
  9. </Nav>
  10. </Navbar.Collapse>

代码块2

  1. const SearchBox = ({ history }) => {
  2. const [keyword, setKeyword] = useState('')
  3. const submitHandler = (e) => {
  4. e.preventDefault()
  5. if (keyword.trim()) {
  6. history.push(`/search/${keyword}`)
  7. } else {
  8. history.push('/')
  9. }
  10. }
  11. };

展开查看全部

相关问题