我正要写回信,这时你用一个switch语句问了这个问题。
render() {
const { isAdmin } = this.state;
return (
<div>
<Header />
<div css={innerWrap}>
{isAdmin && <Button onClick={this.handleAddNewContact}> Add new Contact</Button>}
{
{
[searchModes.SearchAdvisoryPanels]: (
<>
<SearchAdvisoryPanels />
<div css={{ textAlign: 'center', margin: '60px auto' }}>
<ManAtDesk />
</div>
</>
),
[searchModes.noResultsPanel]: <SearchNoResultsPanel />,
[searchModes.resultsPanel]: accountInfo.map((info, index) => (<SearchResultPanel info={info} isAdmin={isAdmin} key={index} />)),
[searchModes.addContactPanel]: <AddNewContactForm onCancelAccount={this.onCancelAccount} onSaveAccount={this.onSaveAccount} />
}[searchMode]
}
</div>
</div>
);
}
但是,此解决方案将安装所有组件,即使它们未显示,使用箭头功能可以通过仅安装所需组件来提高性能:
render() {
const { isAdmin } = this.state;
return (
<div>
<Header />
<div css={innerWrap}>
{isAdmin && <Button onClick={this.handleAddNewContact}> Add new Contact</Button>}
{
{
[searchModes.SearchAdvisoryPanels]: () => (
<>
<SearchAdvisoryPanels />
<div css={{ textAlign: 'center', margin: '60px auto' }}>
<ManAtDesk />
</div>
</>
),
[searchModes.noResultsPanel]: () => <SearchNoResultsPanel />,
[searchModes.resultsPanel]: () => accountInfo.map((info, index) => (<SearchResultPanel info={info} isAdmin={isAdmin} key={index} />)),
[searchModes.addContactPanel]: () => <AddNewContactForm onCancelAccount={this.onCancelAccount} onSaveAccount={this.onSaveAccount} />
}[searchMode]()
}
</div>
</div>
);
}
编辑
如果值未定义,则发送不执行任何操作的函数:
}[searchMode] || (x => x)()
或者将结果存储在返回之外,并调用函数(如果存在):
render() {
const { isAdmin } = this.state;
const searchRender = {
[searchModes.SearchAdvisoryPanels]: () => (
<>
<SearchAdvisoryPanels />
<div css={{ textAlign: 'center', margin: '60px auto' }}>
<ManAtDesk />
</div>
</>
),
[searchModes.noResultsPanel]: () => <SearchNoResultsPanel />,
[searchModes.resultsPanel]: () => accountInfo.map((info, index) => (<SearchResultPanel info={info} isAdmin={isAdmin} key={index} />)),
[searchModes.addContactPanel]: () => <AddNewContactForm onCancelAccount={this.onCancelAccount} onSaveAccount={this.onSaveAccount} />
}[searchMode]
return (
<div>
<Header />
<div css={innerWrap}>
{isAdmin && <Button onClick={this.handleAddNewContact}> Add new Contact</Button>}
{searchRender && searchRender()}
</div>
</div>
);
}
编辑:这是什么黑魔法?
computed properties
,它允许您从变量而不是硬编码的值分配对象键:
const searchModes = {
SearchAdvisoryPanels: "a",
noResultsPanel: "b",
resultsPanel: "c",
addContactPanel: "d"
}
const result = {
[searchModes.SearchAdvisoryPanels]: 1,
[searchModes.noResultsPanel]: 2 ,
[searchModes.resultsPanel]: 3,
[searchModes.addContactPanel]: 4
}
console.log(result)
我们现在可以替换这些值
1 2 3 4
const searchModes = {
SearchAdvisoryPanels: "a",
noResultsPanel: "b",
resultsPanel: "c",
addContactPanel: "d"
}
const search = "c"
const result = {
[searchModes.SearchAdvisoryPanels]: 1,
[searchModes.noResultsPanel]: 2 ,
[searchModes.resultsPanel]: 3,
[searchModes.addContactPanel]: 4
}[search]
console.log(result)
如果返回的值转换为函数,则只需在事件末尾添加括号即可调用:
const searchModes = {
SearchAdvisoryPanels: "a",
noResultsPanel: "b",
resultsPanel: "c",
addContactPanel: "d"
}
const search = "c"
const result = {
[searchModes.SearchAdvisoryPanels]: () => 1,
[searchModes.noResultsPanel]: () => 2 ,
[searchModes.resultsPanel]: () => 3,
[searchModes.addContactPanel]: () => 4
}[search]()
console.log('Short : ' + result)
//Long syntax :
const options = {
[searchModes.SearchAdvisoryPanels]: () => 1,
[searchModes.noResultsPanel]: () => 2 ,
[searchModes.resultsPanel]: () => 3,
[searchModes.addContactPanel]: () => 4
}
const action = options[search]
const output = action()
console.log('Long : ' + output)