javascript - 如果我使用 map 而不是静态组件,路由会重新渲染

标签 javascript reactjs react-router

我的应用程序中有 2 条路线,/validations(这是一个列表)和 /validations/:id(这是专注于特定项目的同一个列表).

我最初静态地编写了我的路线并且一切正常(如预期的那样):

<Route path="/validations/:id" component={Validations} />
<Route path="/validations" component={Validations} />

但是,因为我想做一些重构,所以我将路由放在一个数组中并使用 .map 来呈现它们。但是有了这个,当我点击一个项目时,整个页面重新呈现并且我失去了列表的滚动(这对用户来说是一个糟糕的用户体验,因为他失去了他在列表中的位置):

const routes = [
  {
    path: '/validations/:id',
    component: Validations,
  },
  {
    path: '/validations',
    component: Validations,
  },
]

// ...and in the JSX...

{routes.map(({ path, component }) => (
  <Route
    key={path}
    path={path}
    component={component}
  />
))}

更奇怪的是,如果我删除 Routekey Prop ,我会恢复初始行为(但 React 会发出警告)。

我写错了吗?这是一个 react 路由器错误吗?一个 React 吗?

我怎样才能让列表的滚动与我的路线映射保持一致?

这是一个复制品:https://codesandbox.io/s/vm71x2k46l

最佳答案

我知道有些事情是可疑的,因为我已经做过很多次了,但我没有得到你的结果。所以我注意到您在路线内部呈现了侧边栏。

这就是它重新渲染并将所有内容设置到顶部的原因。因为您实际上导航到另一条路线。

您必须做的是将边栏链接设置在外部实际路由但内部路由器组件。

就像在这个沙盒中一样:https://codesandbox.io/s/p2r4pl2o3q

如果您注意到我稍微更改了路线:

const routes = [
  {
    path: "/",
    component: Index
  },
  {
    exact: true,
    path: "/validations",
    component: Validations
  },
  {
    path: "/validations/:id",
    component: Validations
  }
];

然后创建侧边栏组件并将其设置在路由之外

<BrowserRouter>
  <div>
    <Sidebar />
    <div style={{ marginLeft: 150 }}>{routeComponents}</div>
  </div>
</BrowserRouter>

边栏:

var items = Array.apply(null, Array(300)).map(function(x, i) {
  return i;
});

export default () => (
  <div
    style={{
      width: 150,
      height: "100vh",
      display: "flex",
      overflow: "auto",
      position: "absolute",
      flexDirection: "column"
    }}
  >
    {items.map((item, index) => (
      <Link to={`/validations/${index}`} key={index}>
        Item {index}
      </Link>
    ))}
  </div>
);

现在因为第一次点击滚动不会重置。

PS:请不要介意我只是想看看有什么效果的样式决定。

关于javascript - 如果我使用 map 而不是静态组件,路由会重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51742751/

相关文章:

javascript - 使用 array.push(obj) 错误创建对象数组

reactjs - 如何为每个 Material-UI TableRow 添加 <Link> react 路由器?

javascript - 渲染嵌套组件ReactJS

javascript - 无法更新当前状态的数组

reactjs - AWS Cognito/React.js newPasswordRequired 挑战

reactjs - 使用带有 nginx 的 React 路由器应用程序获取 404

javascript - 你如何一次在一个组件上设置事件状态,并在 React 中删除所有其他组件的事件状态?

javascript - 是否可以使用 spookyjs 从 casperjs 范围内的 Node 范围调用评估函数?

javascript - 如何从一个文本区域复制到另一个文本区域?

javascript - 如何在 Deck.gl 中动态切换多个图层?