【发布时间】:2019-05-07 15:13:14
【问题描述】:
我有一个接收children 的 React 组件,将它们包装在一个 DOM 元素中:
const MyComponent = ({ children }) => <div>{children}</div>;
当 children 解析为 0 个 DOM 节点时,我想跳过渲染容器 DOM 元素(本例中为 div)。
(这是因为容器 DOM 元素可能会在元素为空时提供我们不想要/不需要的语义或样式。)
例如
const MySubComponent = () => null;
declare const maybeChild: string | undefined;
const el = <MySubComponent />;
const el = (
<MyComponent>
{maybeChild}
{el}
</MyComponent>
)
在本例中,生成的 DOM 将是 <div></div>。
大概我应该通过计算 MyComponent 中的 DOM 子项的数量来做到这一点(使用此作为渲染内容的条件),但似乎没有一种简单的方法可以做这个。 (React.Children API 指的是 React 节点树中的子节点,而不是 DOM,因此在这种情况下这似乎没有帮助。)
我知道的一个解决方案是确保 React 节点到 DOM 节点的 1:1 映射。然而,这似乎不切实际,因为组件内部通常具有渲染条件。
【问题讨论】:
-
在渲染组件之前返回 null 怎么样?
-
问题在于,即使所有子元素都渲染为空,React 元素仍然存在,并且可以更新以渲染某些内容而无需重新渲染父元素。
-
没有直接的方法可以做到这一点。您将需要渲染孩子并确保有 DOM 元素。为什么空 div 有问题?这可能是 XY 问题。
-
@OliverJosephAsh 这就是我所说的 XY 问题。使用 :empty 作为样式。这比直接访问 DOM 要简单得多。
-
我不希望重新设计它会破坏封装——它会改变职责的组织方式。某种数据驱动子组件是否呈现任何内容。该数据还应确定是否呈现父级。大概子组件正在获取数据和渲染。如果子组件变得纯粹是展示性的,您可以将当前父组件包装在获取数据的东西中,决定是否需要渲染,如果需要,然后将数据传递给子组件。
标签: reactjs