👻

このエラーの解決方法 Warning : <div> cannot appear as a descendant of <p>

2022/02/26に公開

今回出現したエラー文

Consoleに、以下のようなエラー文が出力された。

Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>

原因を特定して、解決していきましょう!


エラー文をDeepLで翻訳する

まずは、エラー文をちゃんと読む。

でも英語は読めないので翻訳。

<div>は<p>の子孫として表示できません

ん?どういうことだ???

日本語の意味がよくわからん。。


エラー原因調査

この記事 を見てみよう!

この記事を読んだ結果、HTMLにはコンテンツモデルという概念があることがわかった。


エラー原因から仮説を立てる

先ほどのエラー文は、「HTMLの入れ子のルール」に反していることで怒られているエラーの可能性が高い。

今回の場合、pタグの中にdivタグを入れ子にしているからWarningエラーが起きているのかも。

pタグの中にdivタグを、入れ子にすることはできないので、divタグの中にpタグを入れるようにすればこのエラーを解決できるかも?


エラー解決方法

Reactを使用している場合は関数コンポーネントの
returnでJSXを返している箇所のコードを確認すればいい。

なので、まずは以下のようなHTMLの構成になっていないか確認を行う。

const Sample = () => {
  return (
   <p>
     <div>pタグにdivは入れられない</div>
   </p>
 )
}

もし、上記のような構成になっていたら、以下のようにHTMLの構成を変更してあげればOKそう。

const Sample = () => {
  return (
   <div>
     <p>divタグにpタグは入れられる</p>
   </div>
 )
}

結果、自分はこの流れで解決できました!!

なので、上記フローで同じように対応を行えば、このエラーは同じように解決できるはずです!


ところで、なぜpタグにdivタグは入れられないのか?

HTML5から「ブロック要素」と「インライン要素」という概念が廃止されて、入れ子のルールが「コンテンツモデル」という概念で決まるようになったからです。

コンテンツモデルとは「その要素にはどのカテゴリーのコンテンツを入れていいか」を決めているルールのことで、タグの入れ子のルールは全てこの「コンテンツモデル」で決まっています

だからpタグの中にdivタグを入れると「あなたの書いたコードはコンテンツモデル的におかしいよ。なので警告出しとくから直してね」というWarningエラーが出たんですね。Reactは優しい!

この話題に関する詳しい説明は
この記事 が非常にわかりやすいです。

暇な時に軽く目を通しておくと
HTMLをより深く理解できるのでおすすめです!

Discussion