使用映射函数创建多个路由时,相同的组件在具有键时总是卸载
When creating multiple Routes with a map function the same component always unmounts when it has key
v5.2.0
当使用 map
函数创建多个路由时,同一个组件总是重新渲染,尽管文档说在多个路由上使用同一个组件不应触发卸载。
更奇怪的是 key
prop 以某种方式相关:当它被删除时,卸载不再发生。
在第 1 页和第 2 页(由地图生成)之间切换总是会卸载它们,而在第 3 和第 4 页之间切换则不会。
const privatePages = [
{
path: '/page1',
component: <Page num='1' />
},
{
path: '/page2',
component: <Page num='2' />
}
]
function Page({ num }) {
useEffect(() => {
console.log(`page ${num} mount`)
return () => { console.log(`page ${num} unmount`) }
}, [])
return <div>page {num}</div>
}
export default function App() {
return (
<Router>
<Switch>
{privatePages.map((page, index) => (
<Route key={index} path={page.path}>
{page.component} // <=========== Unmounts each time switching between 1 and 2
</Route>
))}
<Route path='/page3'>
<Page num='3' /> // <============ No unmounts between 3 and 4
</Route>
<Route path='/page4'>
<Page num='4' />
</Route>
</Switch>
</Router>
)
}
工作示例:https://codesandbox.io/s/jolly-wave-g1g82?file=/src/App.js:0-1399
发生这种情况是因为当您在页面 1 和页面 2 之间切换时,索引以及 key
属性的值发生变化。每当 key
属性发生变化时,组件将重新挂载(卸载然后坐骑)。
您可以在此处阅读有关 key
的更多信息:https://reactjs.org/docs/lists-and-keys.html
v5.2.0
当使用 map
函数创建多个路由时,同一个组件总是重新渲染,尽管文档说在多个路由上使用同一个组件不应触发卸载。
更奇怪的是 key
prop 以某种方式相关:当它被删除时,卸载不再发生。
在第 1 页和第 2 页(由地图生成)之间切换总是会卸载它们,而在第 3 和第 4 页之间切换则不会。
const privatePages = [
{
path: '/page1',
component: <Page num='1' />
},
{
path: '/page2',
component: <Page num='2' />
}
]
function Page({ num }) {
useEffect(() => {
console.log(`page ${num} mount`)
return () => { console.log(`page ${num} unmount`) }
}, [])
return <div>page {num}</div>
}
export default function App() {
return (
<Router>
<Switch>
{privatePages.map((page, index) => (
<Route key={index} path={page.path}>
{page.component} // <=========== Unmounts each time switching between 1 and 2
</Route>
))}
<Route path='/page3'>
<Page num='3' /> // <============ No unmounts between 3 and 4
</Route>
<Route path='/page4'>
<Page num='4' />
</Route>
</Switch>
</Router>
)
}
工作示例:https://codesandbox.io/s/jolly-wave-g1g82?file=/src/App.js:0-1399
发生这种情况是因为当您在页面 1 和页面 2 之间切换时,索引以及 key
属性的值发生变化。每当 key
属性发生变化时,组件将重新挂载(卸载然后坐骑)。
您可以在此处阅读有关 key
的更多信息:https://reactjs.org/docs/lists-and-keys.html