本記事では、ReactでコンソールログにvalidateDOMNesting(…): <x> cannot appear as a descendant of <x>.のエラーが出力された時の原因と対処法について解説しています。
Reactの学習におすすめ書籍
モダンJavaScriptの基本から始める React実践の教科書

メリット
- JavaScriptの基礎から始めてReactの機能を一通り学べる
- 実務で必要となる知識を意識しながら学習を進められる
- 現場のシチュエーションベースのストーリーで技術解説
楽天ブックス
¥2,860 (2025/02/21 16:37時点 | 楽天市場調べ)


Amazon Kindle Unlimitedに登録すると、月額980円で読み放題だからオススメだよ!



初回30日間は無料だから、まだ登録したことのない人はぜひ試してみてね!
全プログラマー必見!
変数名/関数名にもう悩まない!
変数名/関数名にもう悩まない!
リーダブルコード


メリット
- 美しいコードが書けるが自然と書けるようになる
- 他の開発者が理解しやすいコードになる
著:Dustin Boswell, 著:Trevor Foucher, 解説:須藤 功平, 翻訳:角 征典
¥2,640 (2023/07/23 02:48時点 | Amazon調べ)


目次
原因と対処法
まずはこのエラーが出力される理由ですが、HTML5から導入されたコンテンツモデルに定義されたルールに違反しているのが原因です。
例えば、下記のサンプルコードを見てみましょう。
function App() {
return (
<p>
<div>サンプルコード</div>
</p>
);
}
export default App;
<p>タグの中に<div>タグを配置しています。コンソールログを確認すると「validateDOMNesting(…):<div> cannot appear as a descendant of <p> .」と出力されています。これを日本語に訳すと<div>タグは<p>タグの子要素として表示できません。という意味になります。
つまり、<p>タグの中に<div>タグを配置することはコンテンツモデルのルールに違反しているということが分かります。これをコンテンツモデルのルールに沿って修正します。
function App() {
return (
<div>
<p>サンプルコード</p>
</div>
);
}
export default App;
<div>タグの中に<p>タグを配置する形に置き換えました。これはコンテンツモデルのルール的にOKな書き方になります。これでコンソールログを確認するとエラーが消えています。
参考サイト
HTML5のコンテンツモデルについて知りたい方は、下記のサイトがおすすめです。
おすすめサイト一覧
あわせて読みたい




HTML LS コンテンツモデル ガイド
HTML Living Standardのコンテンツモデルを理解しやすいようにグループ分けしています。要素ごとに使用できる親子を一目で確認できます。
あわせて読みたい




<初心者向け>知っておきたいHTML5の基本【マークアップ編 その1】 | ビジネスとIT活用に役立つ情報(株式…
HTML5でコーディングする際に、「この要素の中にはどのような要素を入れることができるのだろう?」「HTML5のマークアップのルールがわからない」と悩む方が多いと思います…