javascript - 如何在 React 中创建列表/详细信息视图
问题描述
我需要在 React 中为 Web 应用程序实现一种主/详细视图。由于应用程序应该集成到 CakePHP 应用程序中,因此我不能使用 React Router 来处理路由(因为 CakePHP 会处理它们)。
我有一个项目列表,想要浏览它们,显示一个详细视图。项目是嵌套的,因此有要导航到的子项目。
现在我得到了一个 ItemList 组件,它显示了一个带有 clickhandler 的卡片列表。如何在不更改 url 的情况下更改视图?
ItemList 组件看起来像:
class ItemList extends React.Component {
constructor(props) {
super(props);
this.state = {
itemList: []
}
}
componentDidMount() {
fetchItems(...)
}
render() {
return(
<div>
{this.state.itemList.map(item => (
<Item key={item.id} item={item} />
))}
</div>
);
}
}
项目组件看起来像:
class Item extends React.Component {
constructor(props) {
super(props);
this.state = {
item: props.item,
}
}
handleClick = () => {
// How to navigate to another Component?
}
render() {
return(
<div>
<div className="card my-2" onClick={this.handleClick}>
<div className="card-body">
<h5 className="card-title">{this.state.item.title}</h5>
<p className="card-text">{this.state.item.description}</p>
</div>
</div>
</div>
);
}
}
提前致谢!
解决方案
你应该有一个父组件(比如 MainView),它有一个状态(比如 selectedItemId)。
class MainView extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedItemId: [null]
}
}
componentDidMount() {
}
render() {
return(
{!selectedItemId && (<ItemList />)}
{selectedItemId && (
<ItemDetail id={selectedItemId} />
)}
);
}
}
如您所见,它根据 selectedItemId 状态值呈现不同的组件。
在 ItemList handleClick 中,您调用父 MainView 的 setState 来设置所选项目 ID。
因此,在 MainView 的 render() 函数中使用条件渲染,您可以在未选择任何项目时渲染 ItemList,在您选择项目时渲染 ItemDetail。
我不太习惯 ES6 语法组件,所以我的代码可能在某处出错,但你可以得到消息;)
推荐阅读
- java - 如果 (x == "0") 问题
- react-native - 如何在 react-native-webview 中保持上一个网络会话处于活动状态?
- python-3.x - 如何在csv中追加一列
- asp.net-mvc - 记住我选项在 ASP .Net MVC 中不使用 cookie
- protractor - 任何人都经历过并行执行量角器和appiium?
- python - VTK 数据不会出现在 CellData 或 PointData 中(numpy 界面)
- python - 在序列化程序中的方法之间共享数据(Django Rest Framework)
- netsuite - 如何根据addField动态过滤子列表?
- html - 在 Angular 中显示有限数量的条目
- reactjs - 在 React + Firestore 的受保护路由中使用 URL 参数