【发布时间】:2019-07-22 18:26:14
【问题描述】:
如何仅将道具传递给未知元素的 React 元素数组中的第一个元素?例如,在下面的 sn-p 中,elements 是一个最多包含 3 个自定义 Bar 元素的数组,我希望只向第一个传递任意 prop。
function Foo(props) {
const myProp = 'test';
const elements = [
(isP && <Bar prop1={'p'} />),
(isQ && <Bar prop1={'q'} />),
(isR && <Bar prop1={'r'} />),
].filter(x => x);
// Now do something like 'elements[0].props.myProp = myProp'
return elements;
}
上下文是我想在侧边栏中显示三个面板。第一个应显示其标题和正文,其他应仅显示其标题。
我考虑过但不喜欢的一些解决方案:
1) 使用 React 的 cloneElement 方法克隆第一个元素并将其传递给 prop。 1 但是克隆一个 React 元素只是为了设置一个 prop 似乎很糟糕。
2) 预处理布尔逻辑以确定哪个元素将是第一个,然后分配道具。例如,除了更聪明的逻辑之外,类似于下面的代码:
function Foo(props) {
const myProp = 'test';
const elements = [
(isP && <Bar myProp={isP && myProp}/>),
(isQ && <Bar myProp={!isP && isQ && myProp} />),
(isR && <Bar myProp={!isP && !isQ && isR && myProp} />),
].filter(x => x);
return elements;
}
理想情况下,解决方案将高效而简洁地实现目标。如果没有比 (1) 或 (2) 更好的解决方案,我也会接受它作为答案。
编辑:有些地方我忘了澄清。
- 我正在使用 Redux,以防万一考虑到这一点。
-
<Bar />的实例实际上是多种类型(例如Bar、Bas、Baz),以防严重影响答案。 (我错误地过度简化了原始问题。)
【问题讨论】:
-
您只想创建一个
<Bar/>? -
否,0-3 个条形元素,取决于 isP、isQ 和 isR 的值。
-
在(最多)3 个中,只有第一个应该有
myProp? -
是的,没错。
-
isP等的值是多少?布尔值?undefined还是真的?如果myProp在你不想要的时候是 falsy 可以吗?
标签: javascript reactjs