propTypeのポイントは、あなた(そして他の開発者)がコンポーネントの期待する小道具を知っていることを理解しています。これが違反した場合、Reactが警告を出します。
これは正しいです。
この場合の規約は何ですか?
私はあなたがこれに決定的な答えを見つけるとは思わない。あるものを定義した場合、予想されるすべての種類の小道具を定義する必要があると主張する人もいます。あなたがしたように、他の人は親コンポーネント(HOCを除く)によって提供されることはないと言うでしょう。私が最初か最後のカテゴリのいずれかに分類され、そこではすべてのpropTypes
と心配していないことを教えてくれます人々の別のカテゴリは...だ
個人的に
:コンポーネントは、他の人による消費のためであれば
- 、 (例えば、TextField、Buttonなどの)共通のUIコンポーネントやライブラリのインターフェイスなどの場合は、
propTypes
が便利です。それらをすべて定義する必要があります。
- コンポーネントは、特定の目的のために使用されている場合は、単一のアプリケーションでは、それはあなたが間違った小道具が渡されたときに、特に場合(デバッグよりも、それらを維持し、より多くの時間を費やすようにすべての彼らを心配しないように、通常は大丈夫ですあなたは小さく、使いやすい機能部品を書いています)。
routerProps
を含める引数は、今後変更される場合は、withRouter
によって提供される小道具の変更から保護することです。上記のスニペットを見ると、あなたがpropTypes
が
Menu.propTypes = {
userId: PropTypes.number.isRequired,
routerProps: PropTypes.object.isRequired
}
されるべきだと思うかもしれ
const Menu = ({ userId, ...routerProps}) => {
const { pathname } = routerProps.location
return (
// Something using userID
// Something using pathname
)
}
:だから、彼らが実際にどうあるべきか、我々は破壊を必要とするあなたはwithRouter
ためpropTypes
を含めると仮定し
しかし、あなたは間違っているだろう...それらの最初の2行は多くのprops
変換でパックされます。実際には、それはする必要があります
Menu.propTypes = {
userId: PropTypes.number.isRequired,
location: PropTypes.shape({
pathname: PropTypes.string.isRequired
}).isRequired
}
なぜですか?スニペットは同等です:あなたが見ることができるように
const Menu = (props) => {
const userId = props.userId
const routerProps = Object.assign({}, props, { userId: undefined }
const pathname = routerProps.location.pathname
return (
// Something using userID
// Something using pathname
)
}
、routerProps
は実際には全くprops
には存在しません。 ...routerProps
はrest parameterなので、props
の他のすべての値を取得します。この場合はlocation
です(気にしないこともあります)。
希望に役立ちます。
ありがとうございます。私は普通の小道具とHOCの小道具を一度に手に入れることができるとは思えませんでした。 – sonarforte