这是设计上的考虑。如果您查看渲染Invoices
组件的Route
,
<Route path="link/:id" element={<Invoices />} />
这里没有任何东西会导致 (a) Route
重新挂载,以及 (b) 路由组件 Invoices
重新挂载。如果路由路径更新,它只会触发路由组件的重新渲染,实际上只有路由上下文中的值发生了更改。将其视为更新 props 触发组件重新渲染,而不是重新挂载。
如果路由组件需要 "监听" 并响应路由参数的更改,则应使用 useEffect
钩子来执行任何副作用。
例如:
import { Outlet, useParams } from 'react-router-dom';
export default function Invoices() {
const { id } = useParams();
React.useEffect(() => {
console.log('mount');
return () => console.log('unmount');
}, []);
React.useEffect(() => {
console.log("Route parameter changed", { id });
}, [id]);
return (
<div style={{ display: 'flex', paddingTop: '1rem' }}>
<nav>Invoice ID: {id}</nav>
<Outlet />
</div>
);
}
如果您
真的想重新挂载路由组件,则创建一个包装器组件,读取
id
路由路径参数并在路由组件上设置一个React key。
InvoicesWrapper
将保持挂载状态,但当
id
路由参数更新时,
Invoices
组件将重新挂载,因为它具有新的React key。
例如:
const InvoicesWrapper = () => {
const { id } = useParams();
return <Invoices key={id} />
};
...
...
<Route path="link/:id" element={<InvoicesWrapper />} />
...