【发布时间】:2022-01-20 20:28:22
【问题描述】:
如何使用基于界面的功能来根据选项卡选择呈现组件。
假设我有 3 个组件,即
- OneTimeOnlyScheduleComponent
- DailyScheduleComponent
- WeeklyScheduleComponent
我想要某种功能,所有这些组件都实现接口InterfaceBasedComponent
例如
OneTimeOnlyScheduleComponent implements InterfaceBasedComponentDailyScheduleComponent implements InterfaceBasedComponentWeeklyScheduleComponent implements InterfaceBasedComponent
在 ReactJS 中,我应该能够使用工厂模式或其他方式创建对象。
{/* TAB BUTTONS */}
<ul className="nav nav-tabs border-bottom-0" role="tablist">
{
freqType.map(freq => {
return (
![64, 128].includes(freq.key) &&
<li key={freq.key} className="nav-item">
<a href="#freqType1" property_name="freq_type"
className={"nav-link " + (state.freq_type === freq.key ? 'active' : '')}
onClick={(e) => scheduleTypeChange(freq.key)}
data-toggle="tab" role="tab"
aria-controls="freqType1"
aria-selected={state.freq_type === freq.key}>
{freq.value}</a>
</li>)
})
}
</ul>
根据上面的代码,当用户点击其中一个选项卡时,应该会生成相应的组件。
<div className="tab-content border">
{/* One time schedule */}
<div className={"m-2 tab-pane fade " + (state.freq_type === 1 ? showClass : hiddenClass)} id="freqType1" role="tabpanel">
<OneTimeOnlyScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Daily schedule */}
<div className={"m-2 tab-pane fade " + (state.freq_type === 4 ? showClass : hiddenClass)} id="freqType4" role="tabpanel">
<DailyScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Weekly schedule */}
< div className={"m-2 tab-pane fade " + (state.freq_type === 8 ? showClass : hiddenClass)} id="freqType8" role="tabpanel">
<WeeklyScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Monthly schedule */}
< div className={"m-2 tab-pane fade " + (state.freq_type === 16 ? showClass : hiddenClass)} id="freqType16" role="tabpanel">
<MonthlyScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Monthly relative schedule */}
<div className={"m-2 tab-pane fade " + (state.freq_type === 32 ? showClass : hiddenClass)} id="freqType32" role="tabpanel">
<MonthlyRelativeScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Yearly schedule */}
<div className={"m-2 tab-pane fade " + (state.freq_type === 64 ? showClass : hiddenClass)} id="freqType64" role="tabpanel">
<YearlyScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
{/* Year long schedule */}
<div className={"m-2 tab-pane fade " + (state.freq_type === 128 ? showClass : hiddenClass)} id="freqType128" role="tabpanel">
<YearLongScheduleComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
</div>
理想情况下,我希望简化代码以使用基于接口的对象渲染,例如InterfaceBasedComponent。这个接口应该可以创建所需组件的对象。
<div className="tab-content border">
{
freqType.map(freq => {
return (
![64, 128].includes(freq.key) &&
<div className={"m-2 tab-pane fade " + (state.freq_type === freq.key ? showClass : hiddenClass)}
id={"freqType" + freq.key}
role="tabpanel">
<InterfaceBasedComponent schedule={state} onComponentChange={commonScheduleChangeHandler} />
</div>
)}
}
</div >
【问题讨论】:
-
React 支持composition over inheritance,值得一读。
标签: javascript reactjs oop ecmascript-6 javascript-objects