reactjs - 如何处理路由逻辑以防止 componentDidUpdate 中的无限循环?
问题描述
我正在创建一个带有多个选项的标题,具体选项将根据 url 路径名(例如“植物/树”)具有“活动”类。为此,我设置了组件 HeaderOptions 并将所有选项的状态初始化布尔值设置为 false(索引上没有选项处于活动状态)。我实现的逻辑在导航到特定路径名时有效,但是当返回索引时它给了我一个无限循环——我无法找到解决这个问题的方法。
const Header = (props) => {
const {
location,
history,
} = props;
return (
<div className="Header">
<div className="grid-row">
<HeaderOptions location={location} history={history} />
</div>
</div>
);
};
const HeaderWithRouter = withRouter(Header);
class HeaderOptions extends React.Component {
state = {
treeOption: false,
prairieOption: false,
reportOption: false,
};
componentDidUpdate() {
const {
treeOption,
prairieOption,
reportOption,
} = this.state;
const {
location: {
pathname,
},
} = this.props;
if (pathname.includes('/plant/tree') && !treeOption) {
this.setOptionState('treeOption');
} else if (pathname.includes('/plant/prairie') && !prairieOption) {
this.setOptionState('prairieOption');
} else if (pathname.includes('/report') && !reportOption) {
this.setOptionState('reportOption');
} else if (pathname === '/') {
this.setOptionState(null);
}
}
setOptionState(optionName) {
const updateState = {
treeOption: false,
prairieOption: false,
reportOption: false,
};
if (optionName) {
updateState[optionName] = true;
}
this.setState(updateState);
}
...
解决方案
componentDidUpdate(pathname: string) {
.....
} else if (pathname === "/" && (treeOption || prairieOption || reportOption)) {
this.setOptionState(null);
}
}
推荐阅读
- c# - 集合被修改了 C# 异常但不知道为什么
- excel - 回执 Lotus Notes
- c# - .net core 3.1 中的 System.Web.Helpers.Json.Encode() 使用什么替代方法?
- sql-server - 安装 Microsoft SQL Server 2014 的问题
- cakephp - 使用 cakephp 1.2 保存具有多个关系的数据
- ubuntu - 在golang中提取tarball时丢失文件
- java - recyclerview 的问题,我想为每个按钮添加声音,但我不知道如何
- google-apps-script - 结合两个必须一个接一个工作的功能(带触发器)
- java - Recyclerview 使用 SearchView 过滤后位置错误
- c# - LINQ 方法,它按我发送的列名动态排序数据