我需要在渲染我的组件之前获取一些信息。这些信息将由API提供,并通过 AJAX 调用获取。
我只是想等10秒钟再渲染我的组件,但它说:Uncaught Invariant Violation: Login.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
我可以在履行承诺后交付组件吗?
/** Page Login */
class Login extends React.Component {
/**
* @constructor
* @param {object} props La fonction super() appelle le parent pour y transmettre ses propriétés
*/
constructor(props) {
super(props);
this.handleFormSubmit = this.handleFormSubmit.bind(this);
}
/**
* Reçoit les valeurs des formulaires
*/
handleFormSubmit(data) {
const { dispatch } = this.props;
dispatch(fetchLoginAuth(data));
}
normalRender() {
return (
<div id="login-page">
<div className="container-fluid">
<div className="row">
<div className="col-md-2">
<Link to="/" className="home-link"><img src={BASE_URL + '/assets/img/logo.svg'} alt="Logo" /></Link>
</div>
</div>
<div className="row">
<div className="col-lg-4 col-lg-offset-4">
<h1><FormattedMessage {...messages.loginPageTitle} /></h1>
</div>
</div>
{React.cloneElement(this.props.children || <div />, { onSubmit: this.handleFormSubmit, login: this.props.login })}
</div>
</div>
);
}
/**
* Render le component - ReactTransitionGroup
* @return {JSX} Rend la page Registration
*/
render() {
setTimeout(this.normalRender, 10000);
}
}
我使用ES6与JSX,redux,一个通用路由器与React路由器。
非常感谢您的帮助!
6条答案
按热度按时间cyej8jka1#
我通常是这样做的:
下面是将要发生的事情的详细情况...
1.组件即将加载
1.由于
this.state.data
是null
,我们已经传入if块,并返回<div />
。this.setState()
调用,强制重新呈现。this.state.data
现在包含了一个值,我们跳过if块并呈现我们的普通内容。编辑(2019年10月11日):已将组件WillMount()迁移到组件DidMount()
cwxwcias2#
始终让React渲染。
当您执行异步操作时,显示一个加载微调器或其他东西。
lhcgjxsq3#
更新:这个答案现在已经过时了。你最好远离类,使用钩子。
#######################
使用构造函数来代替公认答案的另一种方法。我个人觉得这更简洁一些。
2vuwiymt4#
您可以尝试以下操作
pokxtpni5#
暂停渲染似乎有些笨拙...
为什么不使用占位符子组件来呈现组件的一部分......然后,当 AJAX 调用完成时,触发一个操作来更改状态并呈现原始组件。
无论是在用户体验还是优雅度方面,它都会更好。
0ve6wy6x6#
如果您必须在多个地方处理相同情况,或者您不必使用状态,只是因为要跟踪表示组件中的异步函数回调,有一种简单的方法可以解决这些问题,请参考react-promise。
react-promise提供了一个名为
usePromise
,sandbox的钩子(您可以随意使用)您可以在一段延迟后看到Hello world