我想从父组件向下传递一个prop到它的所有children
,但前提是该prop还没有在子组件上显式设置--组件的用户应该能够轻松地覆盖向下传递的行为。
这与How to pass props to {this.props.children}类似,但不同之处在于我想要“回退”而不是“覆盖”行为:我希望孩子们的现有 prop 优先。
具体地说,我想实现的是一组组件Grid
,Grid.Row
,Grid.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传递到下面几层。坚持那些需要在多个级别的多个组件中访问相同数据的情况。
本质上,我想知道这里最明智和最惯用的方法是什么。
1条答案
按热度按时间enyaitl31#
您可以使用第二种方法代码如下
size是回退大小,如果a大小 prop 已经传递给子元素,它将覆盖父元素传递的值
希望能帮上忙