reactjs 将props传递给`children`,而不覆盖显式设置的props

vsmadaxz  于 2023-06-05  发布在  React
关注(0)|答案(1)|浏览(145)

我想从父组件向下传递一个prop到它的所有children,但前提是该prop还没有在子组件上显式设置--组件的用户应该能够轻松地覆盖向下传递的行为。
这与How to pass props to {this.props.children}类似,但不同之处在于我想要“回退”而不是“覆盖”行为:我希望孩子们的现有 prop 优先。
具体地说,我想实现的是一组组件GridGrid.RowGrid.Column,例如:

<Grid size="big">  // A
  <Grid.Row>  // B
    <Grid.Column>  // C
      <Grid size="small">  // D
        <Grid.Column>  // E
          ...
        </Grid.Column>
      </Grid>
    </Grid.Column>
  </Grid.Row>
</Grid>

size从A传递到B再传递到C,从D传递到E。它没有从C传递到D,因为我们在D元素中显式提供了自己的size

方法

我可以想到几种不同的方法来处理这个问题。

定义第二个后备 prop

有了第二个prop(比如fallbackSize),我们可以用通常的方式用React.cloneElement无条件地设置这个prop。然后子组件首先检查size,如果未定义,则返回到fallbackSize(然后返回到否则会返回的任何位置,如果有的话)。
这给我的印象是一个“不受欢迎的解决方案”,因为它引入了一个新的 prop ,实际上并不代表任何东西,只是为了解决缺乏一个好的方法来提供“后备”的问题。

检查child是否存在prop

我不确定这是否可行,但另一种“方法”是像往常一样使用React.Children.map进行Map,但以某种方式检查子元素是否存在prop,如果不存在,则以通常的方式使用React.cloneElement添加它。
与以前的解决方案相比,这感觉干净多了。然而,它确实需要一种可靠的方式来告诉呈现的子对象已经拥有什么 prop ,我不确定如何做到这一点(只检查child.props.propName就足够了吗?)

依靠新的Context API

React最近(截至2018年年中)引入了一个新的Context API,允许在React树的子树中管理状态。这似乎是一个很好的用例,所以我认为这是要走的路。
也就是说,父代将成为提供者,在其上下文中提供向下传递的prop的值,并且子代将成为相同上下文中的消费者,如果prop没有显式传递,则返回到这一点。
不过,这里也有几个问题:它增加了一些复杂性,我不确定“传递一个属性,让孩子们自动知道它”是否足够小,以至于Context API会矫枉过正。事实上,Context API文档确实提供了以下注意事项:
不要使用上下文只是为了避免将props传递到下面几层。坚持那些需要在多个级别的多个组件中访问相同数据的情况。
本质上,我想知道这里最明智和最惯用的方法是什么。

enyaitl3

enyaitl31#

您可以使用第二种方法代码如下

const renderedChildren = React.Children.map(children, (child) => {
  if (React.isValidElement(child)) {
    return React.cloneElement(child, {
       size,
       ...child.props
  }
})

size是回退大小,如果a大小 prop 已经传递给子元素,它将覆盖父元素传递的值
希望能帮上忙

相关问题