【问题标题】:How to access child nodes of a React components to add a wrapper components to them如何访问 React 组件的子节点以向它们添加包装器组件
【发布时间】:2020-01-23 11:17:35
【问题描述】:

我有一个布局组件GridLayout,它接收一个反应组件WigdetsList。该组件是返回组件列表的功能组件。

我希望能够为列表中该组件的每个子节点添加一个包装器组件。

如果我使用{WigdetsList()} 而不是<WigdetsList /> 它会起作用,因为它变成了一个返回数组的函数。但如果可能的话,我希望能够在那里使用反应组件。因此它变成了一个独生子女。

我不想将<Col key={i} xs={12} lg={4}> 放在WidgetsList 中,因为我想分离关注点。布局组件用于进行布局和功能组件,不与特定布局组件耦合。

这里是代码框:https://codesandbox.io/s/suspicious-brown-u9yr1

应用:

function App() {
  return (
    <GridLayout>
      <WigdetsList />
    </GridLayout>
  );
}

小部件列表:

function WidgetsList() {
  return widgets.map(widget => (
    <StyledWidget key={widget.id}>widget {widget.id}</StyledWidget>
  ));
}

网格布局:

function GridLayout({ children }) {
  return (
    <Grid>
      <Row>
        {React.Children.map(children, (child, i) => (
          <Col key={i} xs={12} lg={4}>
            {child}
          </Col>
        ))}
      </Row>
    </Grid>
  );
}

感谢您的时间和帮助。

【问题讨论】:

  • 你可以使用React.Children.forEach
  • @GiddharthSupta 不,用 React.Children.forEach 替换 React.Children.map 将不起作用。你仍然只有一个孩子。我想访问那个反应组件的子节点。

标签: reactjs


【解决方案1】:

WidgetsList 不需要是 React 组件。它返回一个 React 组件列表,没有任何渲染逻辑。因此,它应该是App 本身内的函数或内联:

function App() {
  return (
    <GridLayout>
      {widgets.map(widget => (
        <StyledWidget key={widget.id}>widget {widget.id}</StyledWidget>
      ))}
    </GridLayout>
  );
}

如果WidgetsList 被呈现为一个表格——例如——那么应该在其中创建Col,因为组件现在关心它自己的布局。

【讨论】:

  • 我的问题的第三段就是这么说的。我知道这行得通,我想知道我是否可以使用组件来实现这一点。谢谢
  • 在你的情况下,使用 React 组件(即使你可以)是没有意义的,因为WidgetsList 不会渲染任何东西。它实际上是一个数组。
  • 它是一个返回数组的函数组件。它也可以返回一个片段,一个 div 或其他。问题依然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
相关资源
最近更新 更多