我正在使用呈现字典列表的组件。我想有选择地传入一个会插入额外列表元素的道具。
...
render() {
return (
<dl>
!! Optional !!
<dt>{this.props.optionalPropObj.label}</dt>
<dd>{this.props.optionalPropObj.value}</dd>
!! Optional !!
<dt>Label One</dt>
<dd>{this.props.foo.one}</dd>
<dt>Label Two</dt>
<dd>{this.props.foo.two}</dd>
<dt>Label Three</dt>
<dd>{this.props.foo.Three}</dd>
...
</dl>
);
}
有几种方法可以做到这一点,但我希望尽量减少这种行为的逻辑足迹。主要问题是因为React需要一个包装元素,<dt>
和<dd>
是子元素。
我可以分成两个回报,效率非常低:
...
if (this.props.optionalPropObj) {
return (
<dl>
// Include optional prop list element
</dl>
);
} else {
return (
<dl>
// Exclude optional prop list element
</dl>
);
}
我可以用css类隐藏它们,但后来我有4个条件:
return (
<dl>
<dt className={this.props.optionalPropObj ? '' : 'hidden'}>
{this.props.optionalPropObj && this.props.optionalPropObj.label}
</dt>
<dd className={this.props.optionalPropObj ? '' : 'hidden'}>
{this.props.optionalPropObj && this.props.optionalPropObj.value}
</dd>
</dl>
);
如果我可以将元素包装在div中,这种情况将是微不足道的。
return (
...
{includeOptional && <OptionalThing />}
or
{includeOptional ? <OptionalThing /> : null}
...
);
理想情况下,我想要一种方法来检查可选的prop一次,并包含额外的元素而不需要任何代码重复。
答案 0 :(得分:0)
你可以试试这个
render() {
return (
<dl>
{
this.props.optionalPropObj &&
<span>
<dt>{this.props.optionalPropObj.label}</dt>
<dd>{this.props.optionalPropObj.value}</dd>
</span>
}
<dt>Label One</dt>
<dd>{this.props.foo.one}</dd>
<dt>Label Two</dt>
<dd>{this.props.foo.two}</dd>
<dt>Label Three</dt>
<dd>{this.props.foo.Three}</dd>
...
</dl>
);
}
答案 1 :(得分:0)
我找到了一种方法来使用有效的Html输出。您有条件地包含一系列元素。由于<dl>
标记的唯一有效子元素是<dt>
和<dd>
,因此我需要一种方法来添加没有包装的片段。
render() {
return (
<dl>
{
this.props.optionalPropObj &&
[
<dt key="optionalPropLabel">{this.props.optionalPropObj.label}</dt>,
<dd key="optionalPropValue">{this.props.optionalPropObj.value}</dd>
]
}
<dt>Label One</dt>
<dd>{this.props.foo.one}</dd>
<dt>Label Two</dt>
<dd>{this.props.foo.two}</dd>
<dt>Label Three</dt>
<dd>{this.props.foo.Three}</dd>
...
</dl>
);
}
编辑:由于我正在渲染一个数组,React想要每个元素的键,所以我添加了一些虚拟键。我一次只在一个页面上显示其中一个,所以我的要求允许它们是静态的。