这个问题有两个部分:

  • 为什么在我的反应方案中,道具类型检查失败?

  • 为什么材料-ui HoC会干扰类型检查?

在制作UI组件时,我通过在单向流中传递道具React.cloneElement,让孩子们不知道彼此 . 在我的方法中,根组件更新其屏幕大小状态,并且它的子节点必须接受并将其传递给下一个子节点,并且他们可以根据为其留下的内容区域维度来调整值 . 这个想法是叶子本身可以根据剩下的空间决定如何渲染 .

在我的简化代码示例中,WithSize-enhancer通知根组件全屏大小,而BridgedContent-enhancer通知叶组件如何/应该呈现:

https://codesandbox.io/s/92vop4oyr4

事实证明,根组件(EnhancedPrimaryUI)从父级或增强器传递必要的道具 . 另一方面,它的道具类型将在页面加载时失败 . 运行devtools只会显示运行时的内容,看起来完全正常:

react nested hoc failed props

我真的不知道为什么它必须像那样!对我来说,它似乎只是React的内部运作 . 我的初步解决方法是在每个子项或App.js see second example中添加defaultProps .

我知道其他替代方法,例如传递上下文或将子组件连接到redux,但是在这种情况下看不出如何激发这种方法 .

我更加困惑,因为我实现了Material-UI,并发现使用WithStyles-enhancer设置样式的每个子组件都会导致没有失败的prop类型! see third example

我知道material-ui使用context只将主题/类传递给withStyles.js,并声称不会修改传递给它的组件 .

那么这里发生了什么?是否通过React的命令间接影响它?它是一个功能还是一个bug?