[解決済み] RouteComponentPropsとカスタムpropsを使用したreactルーティング
質問
この問題で頭がおかしくなりそうです。
まず、私はまだReactの初心者です。次に、投稿する前に、私は試してみました。 react-router v4でルーターコンポーネントにカスタムpropsを渡す そして react 子コンポーネントがpropsを受け取らない
しかし、うまくいきません。
私が達成しようとしているのは、既存のReactプロジェクトにルーティングを追加するだけです。
例えばトップ(父)クラスはこんな感じです。
import * as React from "react";
import { RouteProps } from "react-router";
import { IAppSettings, IAppConfig, IDataAccess } from "../interfaces";
import { AppConfig } from "../appconfig";
import { DataAccess } from "../DataAccess";
import { BookingSiteOverview } from "./BookingSiteOverview";
import { Layout } from "./Layout";
import { NavigationMenu } from "./NavigationMenu";
import { BrowserRouter as Router, Route, Link, Switch, Redirect } from "react-router-dom";
import { RouteComponentProps } from "react-router-dom";
export class CJV extends React.Component<RouteComponentProps<{}>, {}> {
private appConfig: IAppConfig;
private dataAccess: IDataAccess;
constructor() {
super();
const config: IAppSettings = require("Config");
AppConfig.apiUrl = config.ApiUrl;
this.appConfig = new AppConfig();
this.dataAccess = new DataAccess(this.appConfig);
this.dataAccess.getProfiles = this.dataAccess.getProfiles.bind(this);
}
public render() {
return <div>
<Layout>
<NavigationMenu />
<Switch>
<Redirect exact={true} from="/" to="/BookingSiteOverview" />
<Route path="/BookingSiteOverview" exact render={(props) =>
(<BookingSiteOverview getProfiles={this.dataAccess.getProfiles} {...props} />)} />
</Switch>
</Layout>;
</div>;
}
注:エラーは
getProfiles={this.dataAccess.getProfiles}
プロパティ 'getProfiles' はタイプ 'Readonly<{ children?'に存在しません。ReactNode; }> & Readonly>' にプロパティ 'getProfiles' が存在しません。
子クラスです。
import * as React from "react";
import { ProgressSpinner } from "primereact/components/progressspinner/ProgressSpinner";
import { RouteComponentProps } from "react-router-dom";
import { IBookingSiteOverviewState, IBookingSiteOverviewProps } from "../interfaces";
import { ProfileSelection } from "./ProfileSelection";
import { DateRangeSelection } from "./DateRangeSelection";
import { CollectionStatsTable } from "./CollectionStatsTable";
import { IBookingSiteCollectionStat, ICollectionStatHiddenColumnDefinition } from "../models";
export class BookingSiteOverview extends React.Component<RouteComponentProps<{}>, IBookingSiteOverviewState> {
private stats?: IBookingSiteCollectionStat[];
constructor(props: IBookingSiteOverviewProps) {
super();
this.state = { statsLoading: false, applyButtonPressed: false };
}
public render() {
const statsTable = this.state.statsLoading
? <ProgressSpinner />
: <CollectionStatsTable
id="booking-site-stats"
getRowDefinition={this.props.getProfiles}
//<---- Displays error: Property 'getProfiles' does not exist on type 'Readonly<{ children?: ReactNode; }> & Readonly<RouteComponentProps<{}>>'.
stats={this.stats}
statKey="bookingSiteId"
rowExpansionTemplate={this.props.getProfiles}
tableWidth="1341px" />;
const statsSection = this.state.applyButtonPressed ? statsTable : "";
return <div>
{statsTable}
</div>;
}
}
カスタムプロップとリアクトルーティングプロップをどのように渡せば、ルーティングが機能し、子クラスがそのプロパティを受け取ることができるのかがわかりません。
どうすればいいですか?
TypescriptにおけるReactコンポーネントは、このように定義されます。
class ComponentName extends React.Component<PropsType, StateType> { ... }
この場合、BookingSiteOverview は RouteComponentProps<{}> 型のプロップを受け入れ、IBookingSiteOverviewState 型のステートを使用します。
RouteComponentProps<{}>にはgetProfilesの定義がないので、それがエラーの原因になっています。
EDIT
getProfilesはIBookingSiteOverviewPropsで定義されています(OPによる)ので、BookingSiteOverviewのpropsを次のように変更します。
RouteComponentProps<{}> & IBookingSiteOverviewProps
は問題を解決します。
export class BookingSiteOverview extends React.Component<RouteComponentProps<{}> & IBookingSiteOverviewProps, IBookingSiteOverviewState> {
constructor(props: RouteComponentProps<{}> & IBookingSiteOverviewProps) {
super(props);
...
}
...
}
関連
-
[解決済み] Uncaught (in promise) Error: リクエストに失敗、ステータスコード404
-
[解決済み] 矢印本体を囲む予期せぬブロックステートメント
-
[解決済み] React Router - バージョン更新後のwithRouterでTypescriptエラーが発生する。
-
[解決済み] ESLintとTSLintの違い【クローズド】について
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み] クエリ文字列からパラメータ値を取得する方法は?
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React - 式は1つの親要素を持つ必要がありますか?
-
[解決済み】ReactJS: マテリアルuiのブレークポイントについて
-
[解決済み] Jestの `beforeEach` グローバルは何のためにあるのですか?
-
[解決済み] configuration.module に未知のプロパティ 'loaders' があります。
-
[解決済み] useStateプロパティのフックにmap関数を使用する方法
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] ReactJs "インバリアント違反..." リアクトの古典的な問題
-
[解決済み] react-navigation v5を使ったreact-nativeアプリのAppNavigatorの構文を更新する。
-
[解決済み] 拡張子.tsと.tsxの違いは何ですか?どちらもreactのタイプスクリプトファイルの拡張子として使用されます。では、どこで使うべきなのでしょうか?
-
[解決済み] Reactのrender()にFont Awesomeのアイコンを入れる方法