[解決済み] JSX.ElementとReactNodeとReactElementの使い分けは?
質問
現在、ReactアプリケーションをTypeScriptに移行しているところです。これまでのところ、これはかなりうまくいっているのですが、私は、私の
render
関数、特に私の関数型コンポーネントにおいてです。
私はこれまでずっと
JSX.Element
を返り値として使用することができますが、コンポーネントが
ではなく
は何もレンダリングしない、つまり
null
というのは
null
は有効な値ではありません。
JSX.Element
. これが私の旅の始まりでした。ネットで検索してみると
ReactNode
を含むもので、代わりに
null
といったことが起こり得ます。
しかし、関数型コンポーネントを作成する際、TypeScriptは以下のような文句を言います。
ReactNode
という型があります。ここでもいろいろ調べてみると、関数型コンポーネントには
ReactElement
代わりに しかし、そうすると、互換性の問題はなくなるのだが、今度はTypeScriptが再び
null
は有効な値ではありません。
長くなりましたが、3点ほど質問させてください。
-
とはどのような違いがあるのでしょうか?
JSX.Element
,ReactNode
とReactElement
? -
なぜ
render
クラスコンポーネントのメソッドが返すReactNode
を返しますが、機能コンポーネントはReactElement
? -
に関して、どのように解決すればよいのでしょうか?
null
?
解決方法は?
<ブロッククオートJSX.Element、ReactNode、ReactElementの違いは何ですか?
ReactElementは、型とプロップを持つオブジェクトです。
type Key = string | number
interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
type: T;
props: P;
key: Key | null;
}
ReactNode は、ReactElement、ReactFragment、文字列、数値、ReactNode の配列、null、undefined、boolean のいずれかです。
type ReactText = string | number;
type ReactChild = ReactElement | ReactText;
interface ReactNodeArray extends Array<ReactNode> {}
type ReactFragment = {} | ReactNodeArray;
type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
JSX.ElementはReactElementで、propsは汎用型、typeはanyです。様々なライブラリが独自の方法でJSXを実装できるため、JSXはグローバルな名前空間であり、ライブラリによって設定されますが、Reactではこのように設定されます。
declare global {
namespace JSX {
interface Element extends React.ReactElement<any, any> { }
}
}
例によって。
<p> // <- ReactElement = JSX.Element
<Custom> // <- ReactElement = JSX.Element
{true && "test"} // <- ReactNode
</Custom>
</p>
クラスコンポーネントのレンダーメソッドはReactNodeを返しますが、関数コンポーネントはReactElementを返すのはなぜですか?
確かに、これらは異なるものを返します。
Component
が返す。
render(): ReactNode;
そして、関数は、"ステートレス・コンポーネント"です。
interface StatelessComponent<P = {}> {
(props: P & { children?: ReactNode }, context?: any): ReactElement | null;
// ... doesn't matter
}
これは、実は 歴史的な理由 .
nullに関して、どのように解決すればよいのでしょうか?
のように入力します。
ReactElement | null
reactと同じように。あるいはTypescriptに型を推論させる。
<サブ 型のソース
関連
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vue+ElementUIによる大規模なフォームの処理例
-
[解決済み】GETできない / Nodejsエラー
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] encodeURI / encodeURIComponentの代わりにescapeを使用するのはどのような場合ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vue+ElementUIによる大規模なフォームの処理例
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。