reactjs - 反应路由器卸载功能组件
问题描述
我正在使用 React Router 并且有两条路由呈现相同的组件:
<Switch>
<Route path="/aaa" component={Cmp} />
<Route path="/bbb" component={Cmp} />
</Switch>
这是 Cmp 实现:
class Cmp extends Component {
componentWillUnmount() {
console.log('******************* UNMOUNTED');
}
render() {
return null;
}
}
正如我所料,在 Cmp 之间导航/aaa
并/bbb
不会卸载 Cmp。
我正在转向钩子,所以我重写了组件:
function Cmp() {
useEffect(() => {
return () => {
console.log('******************* UNMOUNTED');
};
});
return null;
}
非常令人惊讶的是,在运行应用程序时,在Cmp 已卸载的 console.log/aaa
之间导航。
知道如何使用功能组件和钩子来防止不必要的卸载吗?/bbb
解决方案
如果你想运行一个效果并且只清理一次(在挂载和卸载时),你可以传递一个空数组([])作为第二个参数。这告诉 React 你的效果不依赖于任何来自 props 或 state 的值,所以它永远不需要重新运行。这不是作为特殊情况处理的——它直接遵循依赖项数组的工作方式。...阅读更多
Cmp
现在,每次重新渲染组件时都会调用您的效果。useEffect
如果您只想在卸载时调用效果,则必须将第二个参数与空数组一起传递:
useEffect(() => {
return () => {
console.log('******************* UNMOUNTED');
};
}, []);
推荐阅读
- c++ - 有什么办法可以防止派生类初始化基类引用
- python - 如何将具有从文件中读取的字符串数据的变量发送到python中的sql更新查询
- php - 从复选框获取数据到 laravel 控制器
- ios - 有没有办法在后台每 5 分钟调用一次端点
- arrays - 将数组划分为两个相等和的子集的方法数
- python-3.x - 鼠标悬停时如何隐藏matplotlib图形的x和y值
- php - 如何在 laravel 中使用两个键更新一行?
- javascript - localStorage 以某种方式混淆了我所有的数字
- javascript - React - 嵌入式网站并检测点击的链接
- php - 在 WooCommerce 产品页面中显示自定义产品属性值