javascript - React - 如果 redux 状态发生更改,则防止重新渲染组件
问题描述
我的应用程序中有一些列表 - 有类似的屏幕
ListScreen
CreateItemScreen
EditItemScreen
所以首先用户去ListScreen
,他可以点击“添加项目”去CreateItemScreen
。如果他想删除项目,他需要去EditItemScreen
并放置“删除”按钮。
项目存储在 redux 状态 - 所以当用户创建项目时,它将存储在 redux 中。如果用户编辑它 - 它将在 redux 中进行编辑。如果他想删除项目,则需要在 redux 中将其删除。
当用户单击“删除”系统将其删除并将用户重定向回ListScreen
. 按钮系统触发删除项目 redux 操作,项目被删除并且组件正在重新渲染 - 因为 redux 状态发生了变化,所以组件将被重新渲染。在触发重定向之后(react-router-dom
)。但是在触发重定向之前出现错误。因为 item 已经被删除并且 screen 正在尝试获取一些 item 道具。
组件看起来像:
export const EditItemScreen = ({}) => {
const { itemId } = useRouteMatch().params;
const item = useSelector(getItemSelector(itemId));
const history = useHistory();
const dispatch = useDispatch();
const handleDeleteClick = () => {
history.replace('listPath');
dispatch(deleteItem(itemId));
};
return (
<div>
<h1>{item.title}</h1>
<form>...form</form>
<div>
<button onClick={handleDeleteClick}>
Delete
</button>
</div>
</div>
);
};
当用户单击“删除”时,会出现错误,告诉我无法title
从未定义中获取(因为项目已被删除)。
我可以阻止最后一次重新渲染吗?只是在删除项目之前执行重定向,不要回到这个屏幕,不要重新渲染它?
解决方案
您可以根据是否定义了 item.title 来尝试条件渲染。
推荐阅读
- angular - 为什么使用 catchError 而不是在 Angular 的订阅错误回调中处理错误
- tfs - Azure Devops Pipelines 不构建引用的项目
- javascript - React 应用程序:在 React 中保护开发 URL
- java - 如何检查为 8085 模拟器设置的标志
- amazon-web-services - AWS SFTP Gateway API 测试有效,但 SFTP 客户端返回身份验证失败
- r - R不识别因子
- php - PHP 'include' 可以用来复制 WP 中的 PHP + ACF 部分吗?
- javascript - 使 SVG foreignObject 可滚动
- php - nginx - 子目录的 php 返回 404
- angular - Angular-Reactive-Forms,出现错误,无法读取未定义的属性“get”