我在我的反应应用中导入了四个组件。我如何有条件地渲染其中一个组件(基于道具)。这就是我想要做的事情
<ReactSVGPanZoom
//switch(this.props.Selected){
// case '1': render <ComponentOne/>; break;
// case '2': render <ComponentTwo/>; break;
// case '3': render <ComponentThree/>; break;
// case '4': render <ComponentFour/>; break;
// default: render <ComponentOne/>
}
</ReactSVGPanZoom>
答案 0 :(得分:5)
直接它是不允许的,因为我们无法在JSX中放置任何语句。你可以做一件事,把代码(切换逻辑)放在一个函数中并调用该函数,然后从中返回正确的组件。
检查以下文档:Embedding Expressions in JSX
像这样:
<ReactSVGPanZoom
{this.renderComponent()}
</ReactSVGPanZoom>
renderComponent(){
switch(this.props.Selected){
case '1': return <ComponentOne/>;
case '2': return <ComponentTwo/>;
case '3': return <ComponentThree/>;
case '4': return <ComponentFour/>;
default: return <ComponentOne/>
}
}
<强>建议:强>
break
之后不需要 return
。
答案 1 :(得分:2)
您可以从交换机获取组件(在render
中的函数或内联中)并将其呈现为ReactSvgPanZoom
的子项,如下所示:
getComponent(){
switch(this.props.Selected){
case '1':
return <ComponentOne/>;
case '2':
return <ComponentTwo/>;
// .. etc
default:
return <ComponentOne/>
}
}
render() {
return (<ReactSVGPanZoom>
{this.getComponent()}
</ReactSVGPanZoom>);
}
答案 2 :(得分:2)
为此目的有一个结构:Do Expression
你可以像这样使用它:
<ReactSVGPanZoom
{do {
switch (this.props.Selected) {
case '1': <ComponentOne/>; break;
case '2': <ComponentTwo/>; break;
case '3': <ComponentThree/>; break;
case '4': <ComponentFour/>; break;
default: <ComponentOne/>;
}
}}
</ReactSVGPanZoom>
请记住,在do表达式中不使用return
,而do表达式中的最后一个表达式将是返回值。因此即使你在切换后加上分号也会破坏它。
答案 3 :(得分:2)
render() {
return (
<div>
{
(() => {
switch(this.props.value) {
case 1:
return this.myComponentMethod();
break;
case 2:
return () => { return <AnotherComponent/> };
break;
case 3:
return <div>1</div>;
break;
default: return null; break;
}
}).call(this)
}
</div>
)
}
答案 4 :(得分:1)
您可以创建一个const并在需要时使用它:
import React from "react";
export const myComponents = {
Component1: <Component1 />,
Component2: <Component2 />,
Component3: <Component3 />,
Component4: <Component4 />,
}
现在在您的主要组件中:
import React from "react";
import {myComponents} from "./const";
...
render() {
return (
<div>
{myComponents[this.props.Selected]}
</div>
)
}
答案 5 :(得分:0)
export default function FunctionName(props) {
return (
<div>
{
(() => {
switch (props.value) {
case 1:
return <p>Case 1<;
break;
case 2:
return () => { return <AnotherComponent /> };
break;
case 3:
return <div>1</div>;
break;
default: return null; break;
}
})
}
</div>
)
}