可能用`onEnter`延迟组件渲染?
问题描述:
我正在使用反应路由器onEnter
属性来处理验证,如下所示,也如"auth-flow" example中所示。可能用`onEnter`延迟组件渲染?
function requireAuth(nextState, replace, next) {
Auth.validateToken()
.then(() => {
next();
})
.fail(() => {
replace('/login');
next();
});
}
<Router history={history}>
<Route path="/" component={App} >
<IndexRoute
component={Dashboard}
onEnter={requireAuth}
/>
<Route
path="login"
component={LogInForm}
/>
</Route>
</Router>
我使用的onEnter
异步回调功能,因为我的令牌验证需要一个服务器调用。
我遇到的问题是此示例中的Dashboard
组件在调用next()
之前呈现/挂载。理想情况下,渲染将等待直到回调被触发。
我误解了这是如何工作的?有没有办法延迟渲染路由组件,直到某些条件成立?
答
千万不要延迟路由渲染,您的用户应该得到更好的。
这样做的方式完全不同,那就是让渲染的实际页面包含查看是否有人有权查看它的逻辑,其起始state
的形式与authorized: false
类似,并且回调切换使用this.setState({ authorized: resultFromCallback })
。
这种状态变化将引起反应,您的网页上再次呼吁render()
,如果值是不同,然后在你的页面的render()
功能,您只需检查this.state.authorized
看你是否应该向用户呈现一个包含UI所有他们应该看作匿名用户的位,或者他们应该作为授权用户看到的所有位。
...
componentDidount() {
whateverlib.checkForAuthorization(this.handleAuthorization);
},
handleAuthorization(authorized) {
this.setState({ authorized });
},
render() {
if(this.state.authorized) {
return this.renderAuthorizedUI();
}
return this.renderAnonymousUI();
},
...
还记得你的应用程序仍然是只是在网页上运行JavaScript,所以你为什么会连检查每次加载网页?你所需要做的就是检查任何页面,存储结果并完成。只要用户保持打开状态,他们的授权状态就不会自动从一个反应路由器应用程序管理的页面切换到另一个,因此您可以使用应用程序全局跟踪器。
var authorizer = require('./lib/whatever-thing-you-wrote-for-this');
var YourPage = React.createClass({
...
componentDidMount() {
if (!authorizer.isAuthorized()) {
authorizer.tryAuthorize(this.handleAuthorization);
}
},
handleAuthorization() {
this.forceUpdate();
},
render() {
if(authorizer.isAuthorized()) {
return this.renderAuthorizedUI();
}
return this.renderAnonymousUI();
},
...
});
这些真的是很棒的想法,谢谢!不过,它感觉这应该更多地以“重定向”的方式处理。你不认为未经授权的用户的浏览器应该被重定向到'/ login'之类的东西吗? –
我不知道。网址意味着成为互联网上资源的稳定单位(网络或其他),奇迹般地改变某人认为他们正在遵循的链接,并期望*和*会惹恼您的用户。相反,呈现他们想要的页面,但去“你没有登录。这是登录表单。在这里,没有必要点击任何其他地方,只需填写这个,点击登录,甚至无需重新加载页面,你将获得你正在寻找的内容“。是的,你应该有一个专门的'/ login'路由,用户可以明确地调用,但是你不需要重定向到它。它是反应。 –
详细说明“它是React”:您的登录页面应该合理地使用模块化组件来处理登录 - 当用户尚未获得授权时,也可以在其他页面上使用该组件。登录组件可以容纳所有授权码,您可以使用'onAuthorized = {authorized => this.setState {{authorized})}'属性来引导它,以确保它自动为加载的任何页面执行正确的操作它进入它的用户界面。 –