[解決済み] TypeScriptでReactのステートレス機能コンポーネントを使用して子供を使用する方法?
質問
ReactでTypeScriptを使用する場合、もはや
React.Props
を拡張する必要はありません。
interface MyProps { }
class MyComponent extends React.Component<MyProps, {}> {
public render(): JSX.Element {
return <div>{this.props.children}</div>;
}
}
しかし、ステートレスな機能コンポーネントの場合はそうではないようです。
const MyStatelessComponent = (props: MyProps) => {
return (
<div>{props.children}</div>
);
};
コンパイルエラーを出す。
Error:(102, 17) TS2339: Property 'children' does not exist on type 'MyProps'に存在しません。
これは、バニラ関数が与えられることをコンパイラが知る方法が本当にないからだと思います。
children
を引数に与えることをコンパイラが知る方法がないからでしょう。
そこで問題は、TypeScriptのステートレスな関数型コンポーネントで、どのようにchildrenを使うべきかということです。
古い方法である
MyProps extends React.Props
に戻すこともできますが
Props
のインタフェースは
非推奨とマークされています。
であり、ステートレス・コンポーネントは
Props.ref
をサポートしていません。
ということは、私が定義できるのは
children
プロパティを手動で定義することができます。
interface MyProps {
children?: React.ReactNode;
}
第一:は
ReactNode
は正しい型か?
2つ目:子供をオプションで書かなければならないのですが、(
?
) でないと、消費者は
children
は
属性
であるはずです。
<MyStatelessComponent children={} />
) の属性で、値が提供されていない場合はエラーを発生させます。
何かを見逃しているような気がします。私の最後の例が、Reactで子を持つステートレス機能コンポーネントを使用する方法であるかどうかについて、誰か明確にしてくれますか?
どのように解決するのですか?
React 16.8アップデート。
React 16.8から、名前
React.SFC
と
React.StatelessComponent
は非推奨です。実際、これらは
React.FunctionComponent
型または
React.FC
を略して
同じような使い方をするのでしょうけど。
const MyStatelessComponent : React.FunctionComponent<MyProps> = props =>
<div>
<p>{props.propInMyProps}</p>
<p>{props.children}</p>
</div>
React 16.8 (Older)以前。
とりあえずは
React.StatelessComponent<>
のような型になります。
const MyStatelessComponent : React.StatelessComponent<{}> = props =>
<div>{props.children}</div>
そこで追加したのは、コンポーネントの戻り値の型を
React.StatelessComponent
型にしたことです。
独自のカスタムプロップスを持つコンポーネントの場合 (
MyProps
インターフェース)。
const MyStatelessComponent : React.StatelessComponent<MyProps> = props =>
<div>
<p>{props.propInMyProps}</p>
<p>{props.children}</p>
</div>
今すぐ
props
は
children
のプロパティと同様に
MyProps
インターフェイスのものです。
typescript version 2.0.7で確認しました。
さらに
React.SFC
の代わりに
React.StatelessComponent
に変更しました。
関連
-
[解決済み] React テキストを挟んだ横長の仕切りを作る
-
[解決済み] reactでonloadを使うには?
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] Webpack のコンパイルに失敗した
-
[解決済み] axios-mock-adapter onGet mock data not effective.
-
[解決済み] AxiosにCORSの問題が発生
-
[解決済み] React QueryとReduxの主な違いは何ですか?
-
[解決済み] componentDidUpdate'メソッドはいつ使用するのですか?
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み】Reactの機能的なステートレスコンポーネント、PureComponent、Component、どのような違いがあり、いつ何を使うべきですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ReactJS: マテリアルuiのブレークポイントについて
-
[解決済み] reactでonloadを使うには?
-
[解決済み] error 'document' is not defined : eslint / React
-
[解決済み] material-ui-pickers KeyboardDatePicker をモーメントで使用するには?
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] react jsでウィンドウを開くイベントを処理するにはどうすればよいですか?
-
[解決済み] nextjsで異なる.envファイルを使用するには?
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
-
[解決済み] 拡張子.tsと.tsxの違いは何ですか?どちらもreactのタイプスクリプトファイルの拡張子として使用されます。では、どこで使うべきなのでしょうか?
-
[解決済み] Reactプロジェクトに.envファイルを追加する