私はReactには本当に新しく、ルートにgetComponentがロードされているときに、「ロード中...」画面をレンダリングする方法を理解できません。 getComponent呼び出しはうまく動作し、コンポーネントを表示しますが、リクエストとレスポンスの間に何かが起こっているというUIへの指示はありません。それは私が把握しようとしているものです。失敗したフォーカス取得時使用して表示する「ロード」コンポーネントを強制しようとした後、またはgetComponent関数内react-routerで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;
、私は多分、私は真/偽に積載状態を設定するReduxのを使用して、私のメインのビューコンポーネントを取得してみてくださいと思いましたロード画面表示する:
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);
をこれは私が手動で私が何を探していたものであるアクションを、使用して負荷状態を設定した場合に動作するようです。しかし、(そして、これは本当の問題ではないと思う)私はルータ内からストア/ディスパッチャにアクセスする方法を理解できません。
間違った検索用語を使用しているかどうかわかりませんが、私は完全にアイデアがなく、すべての反応ルータ/レビュックスチュートリアルは私が共通でなければならないと感じているものをスキップするようです問題。
誰でも正しい方向に向けることができます(また、自分が行っていることがベストプラクティスであるかどうかを教えてください)。
EDIT:これをもう少し詳しく解説します。最初のコードブロックで、<Link to="/about">
要素をクリックすると、getComponent関数が起動し、About.jsxコンポーネントが遅延ロードされることがわかります。私が抱えている問題は、リンクをクリックした直後に表示される何らかの種類のローディングインジケータ/スピンナを表示する方法を理解することができず、コンポーネントが読み込まれると置き換えられるということです。
MORE編集:私はロード非同期ルートのラッパーコンポーネントを作成しようとしましたし、動作しているようです、しかし、それは本当にハック感じていると私はそれがこれをやって行くための正しい方法ではないと確信しています。ルートコードは次のようになります。
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;
誰もがより良いアイデアを持っている場合、私に知らせてください。私はルータの中から
をストア/ディスパッチャにアクセスする方法を見つけ出すことはできません
なしがあります:私はここに、この上でいくつかの光を当てることができるかどうかを見てみましょう
おかげで、それは両方のだが、現時点ではより多くの私のコードの問題と、私は私を感じて、コンポーネント内のデータの読み込みではなく、コンポーネントの自己でありますそれを解決しようと間違った方向に行ってしまった可能性があります。私は私の質問を編集して明確にしようとします。 –
About.jsxコンポーネントの読み込みに時間がかかるのはなぜですか?同期して何かをロードしていますか?そのコンポーネントのスケッチを追加できますか? – Nicole
About.jsxは、テキストのページをレンダリングするだけです(レンダリング機能を持つコンポーネントの1つです)。しかし、私は70以上のルートを持つ巨大なアプリケーションを作成する予定です。シンプルなページであれば、他のものは依存関係のヒープを引くより複雑な巨大なものになるので、私はさらに先に進む前にこの非同期のものを最初に見つけ出したいと思います。代わりに非同期読み込みを行うラッパーコンポーネントを作ることができると思っていましたが、それを行う「正しい」方法のようには感じられません。 –