在我的ReactJ组件中,我有很多重复。我希望能够删除该重复。
这是组件的修剪版本:
export default class PageBody extends React.Component {
constructor(props) {
super(props);
this.state = {
displayState: 0
};
}
render() {
const whichLayout = this.state.displayState;
let resultLayout = null;
switch(whichLayout) {
case 1:
resultLayout = <div><Toolbar /><br /><PortfolioBody /></div>
break;
default:
resultLayout = <div><Toolbar /><br /><DefaultBody /></div>
break;
}
return (resultLayout);
}
}
我认为是一个好主意,是串联结果layout,但这似乎不起作用:
let resultLayout = <div><Toolbar /><br />;
switch(whichLayout) {
case 1:
resultLayout = resultLayout + <PortfolioBody />
break;
default:
resultLayout = resultLayout + <DefaultBody />
break;
}
resultLayout = </div>;
想法?
谢谢马特
<PortfolioBody />
不是字符串,您不能加入它。它等效于 React.createElement(PortfoliaBody)
,它返回 object 。
相反,分配可以更改为变量的零件并将其包含在JSX中:
export default class PageBody extends React.Component {
constructor(props) {
super(props);
this.state = {
displayState: 0
};
}
render() {
const whichLayout = this.state.displayState;
let resultLayout = null;
switch(whichLayout) {
case 1:
resultLayout = <PortfolioBody />;
break;
default:
resultLayout = <DefaultBody />;
break;
}
return (
<div>
<Toolbar />
<br />
{resultLayout}
</div>
);
}
}
或更多精简:
const layouts = {
1: PortfolioBody,
};
export default class PageBody extends React.Component {
constructor(props) {
super(props);
this.state = {
displayState: 0
};
}
render() {
return (
<div>
<Toolbar />
<br />
{React.createElement(layouts[this.state.displayState] || DefaultBody)}
</div>
);
}
}
它的 jsx
而不是 string
,因为工具栏是常见的,因此您可以直接使用 render
并将逻辑用于另一个组件。
这样写:
render() {
const whichLayout = this.state.displayState;
let resultLayout = null;
switch(whichLayout) {
case 1:
resultLayout = <PortfolioBody />
break;
default:
resultLayout = <DefaultBody />
break;
}
return (
<div>
<Toolbar />
<br />
{resultLayout}
</div>
);
}
或者您可以通过将switch
零件放入另一种方法中,然后从render
调用该方法来再提高一个级别。
这样:
renderComponent(){
switch(this.state.displayState) {
case 1: return <PortfolioBody />;
default: return <DefaultBody />
}
}
render() {
return (
<div>
<Toolbar />
<br />
{this.renderComponent()}
</div>
);
}