react-activation icon indicating copy to clipboard operation
react-activation copied to clipboard

用KeepAlive包裹的组件中,react-router-dom无法获取params

Open chiihoo opened this issue 5 years ago • 12 comments

用KeepAlive包裹的组件中,可以获取到pathname,但无法获取params。 具体描述如下: Route的path: '/playlist/:id',我访问‘/playlist/12345’, react-router-dom有useLocation和useParams这两个hooks,用useLocation获取到{pathname:"/playlist/12345,...},而useParams只能获取到空对象。用withRouter的效果也是一样的,props.match.params也是空对象。 不包裹KeepAlive则一切正常。

chiihoo avatar May 25 '20 14:05 chiihoo

我知道了,

<Route
  path="/playlist/:id"
  render={props => (
    <KeepAlive>
      <Playlist {...props} />
    </KeepAlive>
  )}
/>

在playlist组件中直接获取props.match.params.id就可以了,不要用withRouter或者useParams

chiihoo avatar May 26 '20 04:05 chiihoo

问题是如何才能使 useParams 正常使用呢?老大有办法解决么?我这边发现通过render传入props,内部组件Props.match也是空的

calmchang avatar Dec 22 '20 08:12 calmchang

问题是如何才能使 useParams 正常使用呢?老大有办法解决么?我这边发现通过render传入props,内部组件Props.match也是空的

用react-router-cache-route这个库,也是同一个作者写的,可以正常使用useParams

chiihoo avatar Dec 22 '20 08:12 chiihoo

可以看看 AliveScope 和 Router 的位置关系,AliveScope 需要在 Router 内部

<Router>
  <AliveScope>
    <Route .../>
  </AliveScope>
</Router>

CJY0208 avatar Dec 22 '20 09:12 CJY0208

的确是在router内部的

calmchang avatar Dec 23 '20 01:12 calmchang

不使用 KeepAlive 是不是就没问题了?

如果有关键代码片段的话,可以呈现一下,有 demo 更好

CJY0208 avatar Dec 23 '20 01:12 CJY0208

不使用 KeepAlive 是不是就没问题了?

如果有关键代码片段的话,可以呈现一下,有 demo 更好

大佬,麻烦你拉 重现地址: https://codesandbox.io/s/keepalivebug-l5lx2 重现方法:将keepAlive注释和释放,对比前后差异,keepAlive存在的时候,组件props.match和useParams输出结果就缺失了页面的参数

calmchang avatar Dec 30 '20 08:12 calmchang

感觉 keepAlive 组件内没有把 match 正确的传递给子组件

calmchang avatar Dec 30 '20 08:12 calmchang

目前看,可能需要加这些东西,5.2.0 后 react-router-dom 不再暴露 RouterContext,我看看怎么解决

image

CJY0208 avatar Dec 31 '20 02:12 CJY0208

目前看,可能需要加这些东西,5.2.0 后 react-router-dom 不再暴露 RouterContext,我看看怎么解决

image

这样在未使用 react-activation/babel 的时候是有效果的 但是如果加上了这个插件,那么/:id 这类的路由在切换id后,mach内的id还是老的id,没有发生变化

calmchang avatar Dec 31 '20 08:12 calmchang

问题是如何才能使 useParams 正常使用呢?老大有办法解决么?我这边发现通过render传入props,内部组件Props.match也是空的

用react-router-cache-route这个库,也是同一个作者写的,可以正常使用useParams

我用react-router-cache-route,也是出现useParams为空的情况,在路由跳转离开的时候触发当前组件的渲染,useParams获取为空报错

xydegithub avatar Jan 25 '21 12:01 xydegithub

@xydegithub react-router-cache-route 应该是 OK 的呀,可以到那边去开个 issues,前两天我看也有人提到这个,不过后来发现又没问题了

CJY0208 avatar Jan 29 '21 09:01 CJY0208