我可以使用菜单或按钮来切换单页应用程序上的 React 组件吗?
Can I use a menu or buttons to switch react components on a single page app?
这是 this thread 的延续,因为我找到了一种更好的方式来表达我的问题。
我只想按侧边菜单上的按钮,这将切换屏幕另一部分的反应组件。目前我的应用程序有嵌套路由,但我不知道如何从嵌套菜单更新组件。
这是我正在尝试做的事情的绘图:
基本上在我单击的每个选项中,我希望在 <HelpPanel/>
部分呈现不同的组件或至少完全不同的信息(我有不同的图表、图像等需要显示)。
最初我试图通过嵌套路由来完成,但到了某个点我卡住了,不知道如何根据用户点击的项目更新我的 <HelpPanel/>
组件。这是当前的相关代码:
//app.js
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={App} handler={App}>
<IndexRoute component={Index}/>
<Route path="about" component={About}>
</Route>
<Route path="help" component={Help}>
<Route path="help/:helpOption" component={HelpPanel}/>
</Route>
</Route>
</Router>,
destination
);
//help.js
导出 class 帮助面板扩展组件{
render(){
return (
<div>{this.props.params.helpOption}</div>
);
}
}
export class 帮助扩展组件{
渲染(){
return (
<Grid>
<Title/>
<Row className="show-grid">
<Col lg={2} md={4} sm={4}>
<HelpMenu/>
</Col>
<Col lg={8} md={8} sm={8}>
{this.props.children || "Please select topic from the menu for more information"}
</Col>
</Row>
</Grid>
);
}
}
我已经为此任务构建了解决方案。不完美,但它有效。
检查一下 http://codepen.io/dagman/pen/gwzBjX.
所以当你点击 option2
<HelpPanel2 />
替代 <HelpPanel1 />
等等。 Afaik react-router 是关于在指定的 url 路径匹配时加载组件。
class HelpPage extends React.Component {
constructor(props) {
super(props);
this.state = {
panelIndex: 0
};
}
getBtnId = (e) => {
if(e.target && e.target.nodeName == "BUTTON") {
console.log(e.target);
this.setState({
panelIndex: Number(e.target.id)
});
}
};
render() {
return (
<div className="container">
<HelpMenu
getBtnId={this.getBtnId}
/>
<HelpPanels
panelIndex={this.state.panelIndex}
/>
</div>
)
}
}
const HelpMenu = ({ getBtnId }) => {
return (
<div
className="btnGroup"
onClick={getBtnId}
>
<button id="0">Option 1</button>
<button id="1">Option 2</button>
<button id="2">Option 3</button>
<button id="3">Option 4</button>
</div>
);
};
class HelpPanels extends React.Component {
render() {
const panels = [
<HelpPanel1 />,
<HelpPanel2 />,
<HelpPanel3 />,
<HelpPanel4 />
];
const correctPanel = panels[this.props.panelIndex];
return (
<div className="panel-box">
{correctPanel}
</div>
);
}
}
const HelpPanel1 = () => (
<h1>Panel for Option 1</h1>
);
const HelpPanel2 = () => (
<h1>Panel for Option 2</h1>
);
const HelpPanel3 = () => (
<h1>Panel for Option 3</h1>
);
const HelpPanel4 = () => (
<h1>Panel for Option 4</h1>
);
ReactDOM.render(
<HelpPage />,
document.getElementById('root')
);
这是 this thread 的延续,因为我找到了一种更好的方式来表达我的问题。
我只想按侧边菜单上的按钮,这将切换屏幕另一部分的反应组件。目前我的应用程序有嵌套路由,但我不知道如何从嵌套菜单更新组件。
这是我正在尝试做的事情的绘图:
<HelpPanel/>
部分呈现不同的组件或至少完全不同的信息(我有不同的图表、图像等需要显示)。
最初我试图通过嵌套路由来完成,但到了某个点我卡住了,不知道如何根据用户点击的项目更新我的 <HelpPanel/>
组件。这是当前的相关代码:
//app.js
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={App} handler={App}>
<IndexRoute component={Index}/>
<Route path="about" component={About}>
</Route>
<Route path="help" component={Help}>
<Route path="help/:helpOption" component={HelpPanel}/>
</Route>
</Route>
</Router>,
destination
);
//help.js
导出 class 帮助面板扩展组件{
render(){
return (
<div>{this.props.params.helpOption}</div>
);
}
}
export class 帮助扩展组件{
渲染(){
return (
<Grid>
<Title/>
<Row className="show-grid">
<Col lg={2} md={4} sm={4}>
<HelpMenu/>
</Col>
<Col lg={8} md={8} sm={8}>
{this.props.children || "Please select topic from the menu for more information"}
</Col>
</Row>
</Grid>
);
} }
我已经为此任务构建了解决方案。不完美,但它有效。
检查一下 http://codepen.io/dagman/pen/gwzBjX.
所以当你点击 option2
<HelpPanel2 />
替代 <HelpPanel1 />
等等。 Afaik react-router 是关于在指定的 url 路径匹配时加载组件。
class HelpPage extends React.Component {
constructor(props) {
super(props);
this.state = {
panelIndex: 0
};
}
getBtnId = (e) => {
if(e.target && e.target.nodeName == "BUTTON") {
console.log(e.target);
this.setState({
panelIndex: Number(e.target.id)
});
}
};
render() {
return (
<div className="container">
<HelpMenu
getBtnId={this.getBtnId}
/>
<HelpPanels
panelIndex={this.state.panelIndex}
/>
</div>
)
}
}
const HelpMenu = ({ getBtnId }) => {
return (
<div
className="btnGroup"
onClick={getBtnId}
>
<button id="0">Option 1</button>
<button id="1">Option 2</button>
<button id="2">Option 3</button>
<button id="3">Option 4</button>
</div>
);
};
class HelpPanels extends React.Component {
render() {
const panels = [
<HelpPanel1 />,
<HelpPanel2 />,
<HelpPanel3 />,
<HelpPanel4 />
];
const correctPanel = panels[this.props.panelIndex];
return (
<div className="panel-box">
{correctPanel}
</div>
);
}
}
const HelpPanel1 = () => (
<h1>Panel for Option 1</h1>
);
const HelpPanel2 = () => (
<h1>Panel for Option 2</h1>
);
const HelpPanel3 = () => (
<h1>Panel for Option 3</h1>
);
const HelpPanel4 = () => (
<h1>Panel for Option 4</h1>
);
ReactDOM.render(
<HelpPage />,
document.getElementById('root')
);