本記事では、ReactでコンソールログにvalidateDOMNesting(…): <x> cannot appear as a descendant of <x>.のエラーが出力された時の原因と対処法について解説しています。
Reactの学習におすすめ参考書
モダンJavaScriptの基本から始める React実践の教科書
先輩くん
Amazon Kindle Unlimitedに登録すると、月額980円で読み放題だからオススメだよ!
後輩ちゃん
初回30日間は無料だから、まだ登録したことのない人はぜひ試してみてね!
綺麗なコードが書けるようになる!
リーダブルコード-より良いコードを書くためのシンプルで実践的なテクニック
先輩くん
より良いコードを書きたい人におすすめの本だよ!
後輩ちゃん
10以上前の書籍ですが、内容は今でも役に立つものばかりです!
原因と対処法
まずはこのエラーが出力される理由ですが、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のコンテンツモデルについて知りたい方は、下記のサイトがおすすめです。