私はReactを初めて使用し、ルートがgetComponentでロードされているときに「ロード中...」画面をレンダリングする方法を理解できません。getComponent 呼び出しは正常に機能し、コンポーネントが表示されますが、UI には要求と応答の間で何かが起こっているという兆候はありません。それが私が理解しようとしているものです。
import Main from './pages/Main.jsx';
import Test from './pages/Test.jsx';
import Home from './pages/Home.jsx';
var Routes = {
path: "/",
component: Main,
indexRoute: {
component: Home
},
childRoutes: [
{
path: "test",
component: Test
},
{
path: "about",
getComponent: function(path, cb) {
require.ensure([], (require) => {
cb(null, require("./pages/about/About.jsx"));
});
}
}
]
};
export default Routes;
onEnter を使用して、または getComponent 関数内で「読み込み中」コンポーネントを強制的に表示しようとして失敗した後、Redux を使用して読み込み状態を true/false に設定し、メイン ビュー コンポーネントに読み込み画面を表示させる必要があるのではないかと考えました。
import React from 'react';
import {connect} from 'react-redux';
import NavBar from '../components/Navigation/NavBar.jsx';
import Footer from '../components/Footer.jsx';
import Loading from './Loading.jsx';
import navItems from '../config/navItems.jsx';
import setLoading from '../actions/Loading.jsx';
var Main = React.createClass({
renderPage: function() {
if (this.props.loading) {
return (
<Loading/>
);
} else {
return this.props.children;
}
},
render: function() {
return (
<div>
<header id="main-header">
<NavBar navigation={navItems}/>
</header>
<section id="main-section">
{this.renderPage()}
</section>
<Footer id="main-footer" />
</div>
);
}
});
function mapStateToProps(state) {
return {
loading: state.loading
}
}
export default connect(mapStateToProps)(Main);
アクションを使用して読み込み状態を手動で設定すると、これが機能するようです。これは、私が探していたものです。しかし(そして、これは本当の初心者の質問になると思います)ルーター内からストア/ディスパッチャーにアクセスする方法がわかりません。
間違った検索用語を使用しているかどうかはわかりませんが、完全にアイデアがなく、react-router/redux のすべてのチュートリアルは、よくある問題であると思われるものをスキップしているようです。
誰かが私を正しい方向に向けることができますか?
編集:これをもう少し明確にしてみます。最初のコード ブロックでは、要素をクリックする<Link to="/about">
と getComponent 関数が起動し、About.jsx コンポーネントが遅延ロードされることがわかります。私が抱えている問題は、リンクをクリックした直後に表示されるある種の読み込みインジケーター/スピナーを表示し、コンポーネントが読み込まれると置き換えられる方法がわからないことです。
詳細編集:非同期ルートをロードするためのラッパーコンポーネントを作成しようとしましたが、うまくいくように見えますが、本当にハッキリしていて、これを行う正しい方法ではないと確信しています. Routes コードは次のようになります。
import Main from './pages/Main.jsx';
import Test from './pages/Test.jsx';
import Home from './pages/Home.jsx';
import AsyncRoute from './pages/AsyncRoute.jsx';
var Routes = {
path: "/",
component: Main,
indexRoute: {
component: Home
},
childRoutes: [
{
path: "test",
component: Test
},
{
path: "about",
component: AsyncRoute("about")
}
]
};
export default Routes;
AsyncRoute.jsx ページは次のようになります。
import React from 'react';
function getRoute(route, component) {
switch(route) {
// add each route in here
case "about":
require.ensure([], (require) => {
component.Page = require("./about/About.jsx");
component.setState({loading: false});
});
break;
}
}
var AsyncRoute = function(route) {
return React.createClass({
getInitialState: function() {
return {
loading: true
}
},
componentWillMount: function() {
getRoute(route, this);
},
render: function() {
if (this.state.loading) {
return (
<div>Loading...</div>
);
} else {
return (
<this.Page/>
);
}
}
});
};
export default AsyncRoute;
誰かがより良いアイデアを持っている場合は、私に知らせてください。