React: cloneElementで提供される必要な小道具は、引き続きコンソールに警告を表示します

作成日 2015年07月27日  ·  3コメント  ·  ソース: facebook/react

わかりやすいように例を挙げましたが、基本的には「必要な小道具が足りない」ため、コンソールに警告が表示されます。

小道具はReact.cloneElement要素に与えられるので、小道具がないという警告が表示されるとは思っていませんでした。 私はこれがエッジケースである可能性があることを理解しています...

https://jsfiddle.net/kdsvgbzu/1/

<A name="name" value="value">
    <B></B>
</A>
class A extends React.Component {
    render() {
        return (
            <div>
                {React.Children.map(this.props.children, function(child) {
                    return React.cloneElement(child, {
                        name: this.props.name,
                        value: this.props.value
                    });
                }, this)}
            </div>
        );
    }
}

A.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};

class B extends React.Component {
    render() {
        return <span>{this.props.name} : {this.props.value}</span>;
    }
}

B.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};

最も参考になるコメント

あなたの実際のユースケース@tleunenが何であったかはわかりませんが、子供に小道具を渡す責任がある再利用可能なコンポーネントを実装しているときに、この問題に遭遇しました。

ReactDOM.render(
   <NumberSelector>
    <ComponentRequiringTheNumber />
  </NumberSelector>
)

結局、私は、よりエレガントな解決策であることがわかった問題を回避しました。

ReactDOM.render(
   <NumberSelector>
    {({number}) => <ComponentRequiringTheNumber number={number} />}
  </NumberSelector>
)

ComponentRequiringTheNumberの依存関係が明示的であり、 NumberSelectorの役割が明らかになるので、私はそれがはるかに好きです。 このように、ネストされたコンポーネントに与えられた小道具は、関連する場合にのみ評価されます。

フィドルに適用: https

全てのコメント3件

これは意図的なものです。 要素の作成時に小道具を検証すると、より有用なエラーが発生します。 また、Flowなどの静的型システムの動作とより厳密に一致します。 今のところ、これらの小道具をオプションとしてマークするのが最善です。 また、将来的には、コンテキストと呼ばれる機能を導入する可能性があります。これにより、Aのような親からBのような子に小道具を渡すための別のサポートされた方法が提供されます。

私もそう思っていました。 ありがとう@spicyj

あなたの実際のユースケース@tleunenが何であったかはわかりませんが、子供に小道具を渡す責任がある再利用可能なコンポーネントを実装しているときに、この問題に遭遇しました。

ReactDOM.render(
   <NumberSelector>
    <ComponentRequiringTheNumber />
  </NumberSelector>
)

結局、私は、よりエレガントな解決策であることがわかった問題を回避しました。

ReactDOM.render(
   <NumberSelector>
    {({number}) => <ComponentRequiringTheNumber number={number} />}
  </NumberSelector>
)

ComponentRequiringTheNumberの依存関係が明示的であり、 NumberSelectorの役割が明らかになるので、私はそれがはるかに好きです。 このように、ネストされたコンポーネントに与えられた小道具は、関連する場合にのみ評価されます。

フィドルに適用: https

このページは役に立ちましたか?
0 / 5 - 0 評価