我对 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 组件。我遇到的问题是我无法弄清楚如何显示某种加载指示器/微调器,它会在单击链接后立即出现,然后在组件加载后将其替换。
更多编辑:我已经尝试创建一个用于加载异步路由的包装器组件,它似乎可以工作,但是感觉真的很hacky,我确信这不是正确的方法。路由代码现在如下所示:
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;
如果有人有更好的想法,请告诉我。