質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

3回答

960閲覧

ReactでdangerouslySetInnerHTMLの挙動がおかしい

QQQ777

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/11/04 12:53

実現したいこと

<p className='testclass'>a</p>となっていて欲しい

前提

取得した文字列のhtmlをReact上で表示したいと考えています。
お力をお借りできるとありがたいです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

<div dangerouslySetInnerHTML={{ __html: "<p className='testclass'>a</p>" }} />とするとデベロッパーツールで確認すると、<p classname='testclass'>a</p>となってしまいます。 classNameがclassnameとなっている状況です。 なぜ、nameのNだけが変換されてしまうのかわからなくて困っています。

該当のソースコード

jsx

1<div dangerouslySetInnerHTML={{ __html: "<p className='testclass'>a</p>" }} />

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2023/11/04 13:48

たぶん、その文字列は JSX として解釈されるのではなく、そのまま innerHTML にセットされるのでは。 そもそも危険だと自分で言ってるので使わないに越したことはないでしょうし。
QQQ777

2023/11/04 14:02

コメントありがとうございます。 私は危険だとは言っていませんが、どなたかの質問と混同されているのでしょうか? そのまま innerHTMLにセットされる場合、勝手に変換されるのでしょうか?
hoshi-takanori

2023/11/04 14:08 編集

想像ですが、そのまま innerHTML にセットされた結果、JSX ではなく普通の HTML として、React は関与せずにブラウザが解釈することになるのでは。 また、「危険だと自分で言ってる」の主語はその属性名 (dangerously なんちゃら) です。言葉足らずで失礼しました。
QQQ777

2023/11/04 14:24

属性名のことでしたか。 innerHTMLの代替としてdangerouslySetInnerHTMLがあるようなのですが、どの様なことが原因でNをnに変換がかかるのでしょうか?
hoshi-takanori

2023/11/04 14:57

HTML はタグや属性名の大文字小文字を区別しませんので。className なんて属性もありませんし。
QQQ777

2023/11/04 15:43

それではdangerouslySetInnerHTMLとしては正常な動きなのでしょうか? 区別しないなら変換しないでそのまま文字として出てきそうな気がします。 実現したいことを実現するにはどの様にすれば良いのでしょうか?
maisumakun

2023/11/05 07:37

> 実現したいことを実現するにはどの様にすれば良いのでしょうか? あえてclassではなくclassNameを指定したい理由はなんですか?
QQQ777

2023/11/06 00:09

reactで、classではなくclassNameで指定しないとcssが反映しないからです。
guest

回答3

0

reactで、classではなくclassNameで指定しないとcssが反映しないからです。

いえ、 dangerouslySetInnerHTMLは書いての通り純粋なHTMLを指定するので、classNameではなくclassで書く必要があります。

jsFiddle

投稿2023/11/06 01:24

maisumakun

総合スコア146622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/11/06 22:17 編集

最初の質問にある、「実現したいこと」が妥当ではない(CSSのためのクラス指定をしたいならこの場面ではclassNameと書いてはいけない)、という趣旨の回答です。
QQQ777

2023/11/07 02:38

すみません。 実現したいことを実現するにはどの様にすれば良いのでしょうか? dangerouslySetInnerHTMLにこだわるつもりはありません。 実現したいことを実現するための手段として選択しましたがNをnに替えるのが仕様とのことでしたら、実現したいことを実現するにはどのようにするのが適切なのでしょうか?
maisumakun

2023/11/07 02:59 編集

> 実現したいことを実現するにはどのようにするのが適切なのでしょうか? 実現したいことが「dangerouslySetInnerHTMLで出力したHTMLにクラスでCSSを適用すること」なのであれば、「classNameでなくclassと書く」のが適切です。 そうでなく「あくまでclassNameというHTMLを出力したい」というのであれば、なぜそれを実現したいのか(それを実現した結果として何を目指しているのか)、その背景を説明してください。真に実現したいことによっては、別な代替手段も考慮可能です。
QQQ777

2023/11/08 00:26

> 真に実現したいこと ## 実現したいこと <p className='testclass'>a</p>となっていて欲しい ## 前提 取得した文字列のhtmlをReact上で表示したいと考えています。 取得した文字列から変換されると困ってしまいます。
maisumakun

2023/11/08 01:35 編集

もしかして、「HTMLをHTMLとしての処理は行わず、単なる文字列として」表示したいということでしょうか? そうであれば、{ "<p className='testclass'>a</p>" }のように単にHTML文字列を中括弧でJSX内に埋め込むだけで、自動でエスケープが行われて、HTMLタグがタグとして働かない、単なる文字列として出力されます。
QQQ777

2023/11/08 06:11

<p className='testclass'>a</p>の状態で、JSX内でHTMLタグとして使用したいです。
maisumakun

2023/11/08 06:29 編集

なぜそれを行いたいのですか?(「取得した文字列から変換されると困ってしまいます。」が、どのように困っているのかも推測すらできない状況です) ブラウザに出力した際に、classNameという属性はブラウザにとっては意味も持たず、またNの大小すら保存されないことはすでに触れたのですが、それを行ってどういう意味を持つ状況なのでしょうか?
maisumakun

2023/11/08 06:41

> <p className='testclass'>a</p>となっていて欲しい HTMLファイルに<p className>と書いてすら、ChromeやFirefoxの検証ツールでclassnameとなります。 「直接的に実現することは不可能」なのですが、このようなHTMLを構築すること「自体」が目的だったのですか?そうでないなら、このようなHTMLを構築することで何を実現したかったのかの方をご説明いただければと思います。
QQQ777

2023/11/08 15:23

前提となる知識が不足していたようです。 ご協力ありがとうございました。
guest

0

className プロパティではなく class 属性を設定したいのでしたら、"<p class='testclass'>a</p>" じゃないでしょうか。

属性名の大文字小文字を区別しないのはブラウザ内蔵のHTMLパーザです。メモリ上では属性名は小文字にして保存しているのでしょう。

投稿2023/11/04 23:46

編集2023/11/05 02:17
int32_t

総合スコア21929

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ReactのJSXは、JavaScriptで記述されたHTMLのようなものであり、ブラウザで表示されるHTMLに変換されます。この変換処理は、Reactのビルドプロセスによって行われます。
Reactのビルドプロセスでは、JSXの要素の属性を分析し、HTMLの属性に変換します。このとき、className属性はclass属性に変換されます。
そのため、ReactでJSXで記載したclassNameという文字列は、buildしてHTMLにする時にclassに書き換わります。

正常な動作の様で、dangerouslySetInnerHTMLは特に関係ありませんでした。
また、実現したい事は動作の途中では叶っていたので問題なさそうです。

投稿2023/11/08 15:23

QQQ777

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問