React children抛出PropTypes错误

时间:2018-05-09 11:49:57

标签: javascript reactjs react-proptypes

我想知道如何在将组件作为子组件传递时处理PropTypes错误:

Failed prop type: The prop `value` is marked as required in `ChildComponent`, but its value is `undefined`.

渲染按预期工作,并正确传递值prop。

我想这是因为我将组件放在App组件的渲染函数中而没有任何道具。 当ChildComponent映射到其子项(即ChildComponent)时,我只将这些道具传递给ParentComponent

请参阅代码:https://codesandbox.io/embed/r70r5z3j9q

有没有办法防止这种情况发生? 我应该如何构建我的组件? 我不应该把孩子作为孩子来传递吗?

已编辑:将道具“名称”更改为“值”。给它一个更通用的感觉。 我试图简化代码中的问题。 我知道我可以直接在App传递道具。 用例是当父进行计算并且那些计算应该传递给子进程时。没有明确知道这些孩子是什么。 这就是我首先将它作为孩子使用的原因。

1 个答案:

答案 0 :(得分:2)

你正在使用cloneElement而你正在向它传递道具,而不是原始元素。要修复它,直接传递道具:

const App = () => (
  <div>
    <ParentComponent>
      <ChildComponent name="bob" />
    </ParentComponent>
  </div>
);

您可以轻松地将组件作为道具(而不是孩子)传递给您ParentComponent,并且只有在需要进行一些繁重的计算后才能渲染它:

const App = () => (
  <div>
    <ParentComponent component={ChildrenComponent} />
  </div>
);

const ParentComponent extends React.Component {
  state = { heavyComputationFinished: false } // initial state

  componentDidMount() {
    runYourHeavyComputations
      .then(() => { this.setState({ heavyComputationsFinished: true }) })
  }

  render() {
    const { component } = this.props
    const { heavyComputationsFinished, name } = this.state

    // return nothing if heavy computations hasn't been finished
    if (!heavyComputationsFinished) { return null }

    // we're getting this component (not its rendering call) as a prop
    return React.render(component, { name })
  }
}