反応ルータ3.xから4.xに切り替わりました。ネストされたルートをレンダリングできません。 反応ルータ4つのネストされたコンポーネントが正しく動作しない
は私が<div>Hello world App</div>
と
App
コンポーネントが完全にレンダリング
<div>Hello world Home</div>
をレンダリングする簡単なdivタグがあるcreate-react-app
index.js file
import React from 'react';
import ReactDOM from 'react-dom';
import Routes from './routes';
import './index.css';
ReactDOM.render(<Routes />, document.getElementById('root'));
routes.js file
import React from 'react';
import _ from 'lodash';
import {
BrowserRouter as Router,
Route,
} from 'react-router-dom';
import { dojoRequire } from 'esri-loader';
import EsriLoader from 'esri-loader-react';
import App from './components/App';
import Home from './components/Home';
/**
* Helper component to wrap app
*/
class AppWrapper extends React.Component {
/**
* Util function to render the children
* Whenever a state change happens in react application, react will render the component again
* and we wish to pass the updated state to the children as props
*/
renderChildren() {
const {children} = this.props;
if (!children) {
return;
}
return React.Children.map(children, c => React.cloneElement(c, _.omit(this.props, 'children'), { }));
}
render() {
const child = this.renderChildren();
return (
<App {...this.props}>
{child}
</App>
);
}
}
/**
* Root Loader component to load esri api
*/
class LoaderComponent extends React.Component {
constructor(props) {
super(props);
this.state = { loaded: false };
}
/**
* Callback fired when arc GIS api is loaded
* Now load the requirejs modules using dojorequire
*/
esriReady() {
dojoRequire(['esri/Map', 'esri/views/MapView'], (Map, MapView) => {
this.setState({ Map, MapView, loaded: true });
});
}
render() {
const options = {
url: 'https://js.arcgis.com/4.3/',
};
return (
<div>
<EsriLoader options={options} ready={this.esriReady.bind(this)} />
<AppWrapper {...this.state}>
<Route exact path="/home" component={Home} />
</AppWrapper>
</div>
);
}
};
const Routes = (props) => (
<Router {...props}>
<Route exact path="/" component={LoaderComponent} />
</Router>
);
export default Routes;
アプリケーションとホームのコンポーネントを使用してアプリケーションをブートストラップが、私はhttp://localhost:3000/home
コンポーネントにナビゲートするとき、私は見ます空のページ。私がやりたい何
は、ユーザが/home
にリダイレクトする必要があるアプリを立ち上げて、私はApp
コンポーネント現在
<Route exact path="/a" component={A} />
<Route exact path="/b" component={B} />
ための2つの追加のルートを定義したいと思います
ですアプリの読み込みで/home
にリダイレクトできず、App
コンポーネントのネストされたルートを定義できません。
注:上記のコードは、反応ルータバージョン3.xで正常に動作していました。ページの読み込みにリダイレクトするには、
IndexRedirect
を使用します。
私はすでにthisとthis質問を見ていたし、私はこれらの質問にすべての可能な解決策を試したが、どれも作業していません。
すべてのルート処理をroutes.js
ファイルにしたいと思います。
あなたは 'LoaderComponent'を見逃しました。私はいくつかの外部APIをロードする必要があります。 – Ritesh
ホーム、A、Bの3つのコンポーネントはすべて、階層に従う必要があります。 'LoaderComponent - > App-> Home/A/B' – Ritesh
私は答えを階層で更新しました。 react-router-4のすべてがコンポーネントなので、コードを整理できる構造でなければ、1つのファイル( 'routes.js')だけでなく、どこでもルートを定義できます。 –