在 React Router 中,当路由发生变化但目标组件是同一个组件时,应该如何触发该组件的重新渲染?请阐述实现方式及原理。
考察说明
考察对 React Router 路由变化与组件生命周期关系的理解,以及如何强制重新渲染同一组件的技术方案。
回答思路
- 【回答框架 1】当路由变化导致渲染的组件类型相同时,React 会复用该组件实例,不会触发重新挂载,但会更新传入的 props(如路由参数)。组件可以通过 props 变化来感知路由变化。
- 【回答框架 2】可以利用 React Router 提供的 Hook,例如 useParams、useLocation,这些 Hook 会订阅路由变化,当路由变化时,组件会重新渲染。这是最常见的方式,也是官方推荐的做法。
- 【回答框架 3】如果需要在路由变化时执行副作用,可以在 useEffect 中监听依赖的 params 或 location,因为依赖变化会触发 effect 重新执行。
- 【回答框架 4】如果需要强制重新挂载组件,可以在组件上使用 key 属性,将路由参数或 location.key 作为 key,这样路由变化时 key 改变,React 会卸载旧组件并挂载新组件。
- 【关键点 1】React 复用相同类型组件实例,不会自动重新挂载,但会更新 props。
- 【关键点 2】使用 useParams、useLocation 等 Hook 可响应路由变化,触发重新渲染。
- 【关键点 3】使用 key 属性强制重新挂载组件。
- 【易错点 1】不推荐直接使用 shouldComponentUpdate 或手动强制刷新,因为可能破坏组件状态。
- 【易错点 2】如果依赖 route path 而非参数变化,组件可能不会重新渲染,需要确保监听正确的源。