無駄と文化

実用的ブログ

React の className と SolidJS の class

この記事は はてなエンジニア Advent Calendar 2024 の 28 日目の記事です。昨日は id:onishi さんの「Google Chromeサイト内検索10連発」でした。

React の className

React において HTML の class 属性を設定するには className キーワードを使う。

// React

function FooComponent() {
  return <div className="foo">Foo!</div>;
}

なぜ class="foo" ではなく className="foo" なのか。
巷では「class は JavaScript における予約語だからだ」という噂が囁かれている。

が、どうやらその理解は正確ではないらしい。

 

SolidJS の class

SolidJs では class 属性を設定するのに class キーワードを使う。

// SolidJS

function FooComponent() {
  return <div class="foo">Foo!</div>;
}

こういうのでいいんだよ、こういうので。

 

SolidJS で class="foo" と書ける理由として、巷では「SolidJS にはクラスコンポーネントが無いからだ。だから class を使っても混乱が無いんだ」という噂が囁かれている。

が、それも違う。(タブンネ)

 

Preact 由来の差異

React との差異は、SolidJS が内部的に Preact を使っていることに由来している。
Preact では <div class="..."> のように 書ける 。加えて Preact にも クラスコンポーネントがある

「JSX には className しかないんだ!だからこれがいちばんいいんだ!」と思ってたのに、ただの React のローカルルールだったのか。

 

私からは以上です。

 

だったら何故

...じゃあないんだよ。だったら何故 React では className なんだよ。

というわけで調べようとしたら、答えが全部書かれた記事が在りました。

要約すると、

  • className と書かなければいけないのは、予約語だからでも JSX の制約でもレンダリング処理の制限でもない
  • 実際 Preact では class と書けるし、それで問題は起こらない
  • Preact の JSX は「HTML と同じように書ける」ことを目指しているので class と書くことを許しているのだろう
  • (推測だが) React の classNameElement: className プロパティ にインスパイアされ、その慣習を受け継いでいるのではないか?

とのこと。ふーむ、なるほどね。

 

 

私からは以上です。