【问题标题】:Nested Routing and Material-UI List not working嵌套路由和 Material-UI 列表不起作用
【发布时间】:2021-03-05 16:38:51
【问题描述】:

我有一个问题,我在侧边栏中使用了 material-ui,但路径不起作用。这是我的代码:

import React, { useState } from "react";
import { NavLink as RouterLink } from "react-router-dom";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";

export const Sidebar = (props) => {
  const { menu } = useSelector((state) => state);
  const [selectedIndex, setSelectedIndex] = useState(1);

  const handleListItemClick = (event, index) => {
    setSelectedIndex(index);
  };

  return (
    <List component="nav">
      {menu.map((text, index) => (
        <ListItem
          key={text.id}
          selected={selectedIndex === text.id}
          onClick={(event) => handleListItemClick(event, text.id)}
          component={RouterLink}
          to={text.url}
          button
        >
          .....
        </ListItem>
      ))}
    </List>
  );
};

点击菜单会重新加载整个页面。

This is the HTML

SessionRouter - This is the component where I call the Sidebar

AppRouter - This is where i call SessionRouter

PrivateRoute component

请帮忙。

【问题讨论】:

  • 所以您正在构建的菜单正在正常工作,不是吗?问题是你的屏幕没有变化?
  • 它不会改变组件,域也不会,例如,一开始这个 domain.com/ruta1 我希望它去 domain.com/ruta2 但它总是停留在域。 com/ruta1,尝试放置包裹 Listitem 的 Navlink,如果它改变它但重新加载整个页面
  • 在您的 to= {text.url} 中,您确实在路线之前通过了 / 吗?
  • 是的,数组的一个例子是 = [{label: "Iniciar una queja", id: 1, url:"/iniciarqueja"}]
  • 你能试试这个吗?并将重定向放在所有路由的顶部

标签: reactjs material-ui react-router-dom


【解决方案1】:

现在您已经为您的问题添加了更多信息,特别是来自AppRouterPrivateRouterSessionRouter 的屏幕截图,我能够重现您的问题。我的答案将基于React Router Dom - Nesting Example

如您所见,该示例与您的代码有些相同。结构如下:

  1. 一个主要组件(在您的情况下为:AppRouter,在示例中为:NestingExample)带有一个包含所有内容的 Router,包括带有一些 RouteSwitch
  2. 第二个组件(在您的情况下为:SessionRouter,在示例中为:Topics)具有更多信息(在您的情况下,它是一个带有链接和内容的侧边栏)和另一个具有不同 RouteSwitch从第一个开始。

页面中的示例使用useRouteMatch 来获取urlpath,但您实际上并不需要它,因为您的“基本路线”是“/”。因此,如果您查看孔图片,您可以看到您的“路由”结构与 react-router-dom 页面中的示例完全相同。但是有一点细节,为此,我想邀请您在页面示例中尝试以下操作:在NestingExample 函数中将exact 属性添加到“主题”Route,如下所示:

<Switch>
     <Route exact path="/">
         <Home />
     </Route>
     <Route exact path="/topics">
         <Topics />
     </Route>
</Switch>

尝试单击任何主题,您会发现这与您遇到的问题相同。 所以,有了这个,我的建议是将exact={false} 属性添加到AppRouter 中的PrivateRoute 组件(因为你有...rest

【讨论】:

  • 按照你的第一个指导它对我有用,包装组件 ,谢谢! !这解决了页面的重新加载问题。
  • 很高兴听到这个消息!
【解决方案2】:

要解决此问题,您可以将url 传递给handleListItemClick,当单击按钮时,您可以使用history 库的push 方法更改页面:

const handleListItemClick = (event, index, url) => {
  setSelectedIndex(index);
  history.push(url);
};

你应该更新ListItem的渲染:

<ListItem
  key={text.id}
  selected={selectedIndex === text.id}
  onClick={(event) => handleListItemClick(event, text.id, text.url)}
  component={RouterLink}
  to={text.url}
  button
>
  .....
</ListItem>;

【讨论】:

  • 它可以工作,但页面会重新加载......这是不应该发生的事情
  • 尝试添加onClick={(event) =&gt;e.preventDefault(); handleListItemClick(event, text.id, text.url)}应该会正常停止重新加载
  • @RukkiesMan ,它可以工作,但会再次重新加载整个页面
猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 2017-10-05
  • 2016-07-28
  • 2014-11-17
  • 2019-09-18
  • 2015-11-25
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多