reactjs - 在 React 路由器中使用有状态组件
问题描述
想象一下带有标签的应用程序,它允许用户在用户可以输入不同信息的不同区域之间切换。
我想创建一个表示此选项卡的开关组件,并根据当前路由器状态呈现具有用户相关信息的另一个组件。主要困难在于子组件是有状态的——它们已经可以包含用户输入的一些文本。我尝试通过react-router
以下方式简单地实现这个组件:
class Application extends React.PureComponent {
public render(): React.ReactNode {
const items = ["A", "B", "C"];
return (
<div>
<header>
<ul>
{items.map((item, i) =>
(<li key={i}>
<Link to={"/" + item}>{item}</Link>
</li>))
}
</ul>
</header>
<SwitchComponent items={items}/>
</div>
);
}
}
class SwitchComponent extends React.PureComponent<{items: string[]}> {
public render(): React.ReactNode {
const { items } = this.props;
return (
<Switch>
{items.map((item, index) =>
<Route key={index} path={"/" + item} render={
() => (<StatefulComponent {...item}/>)
}/>)
}
</Switch>
);
}
}
class StatefulComponent extends React.PureComponent<{}, {text: string}> {
public state = {
text: "",
};
public onChange(text: string) {
this.setState({text});
}
public render(): React.ReactNode {
const { text } = this.state;
return (
<input value={text} onChange={
(event) => this.onChange.bind(this)(event.target.value)}
/>
);
}
}
在这里,我实现了一个简单的Application
组件,其中包含通过组件实现的导航区域<Link>
和包含路由切换的内容区域。
此实现不保留<StatefulComponent>
状态,因为<SwitchComponent>
每次用户切换到另一个链接时都会重新创建。
在这种情况下,如何保留组件的状态?
解决方案
你不能。React 路由器卸载不需要<Route>
的组件(不匹配的<Route>
组件,使用时只安装一个组件react-router
)。
推荐阅读
- python - 为什么 Scrapy CrawlerProcess 将控制权交给它之前的行,导致它和上一行运行 2-3 次?
- javascript - 在 MVC 应用程序中使用相同的 js 文件提供两个不同的功能(请不要使用 **Jquery** 解决方案)
- r - 将表中的列变量从数字年份转换为日期年份 (01-01-2021)
- vue.js - Vue3 在服务器上获取触发 CORS 策略,但在使用 PHP CURL 或 ReqBin 时不会
- java - 从 JSON 数组中获取子键和值:Java
- firebase - 当我从控制台向文档添加字段时,Flutter Firestore 没有提供更新的数据
- python - 如何使用 for 循环检查数字是否为素数?(Python)
- reactjs - Rollup:输出有很多随机文件,如何防止它们生成?
- html - 如何修复 HTML 中的按钮位置?
- html - 如何只制作 div 背景的颜色部分?