'Home'是一个基于xhr响应重定向的中间组件。我希望'Home'按照渲染/返回显示'Loading ...',直到它收到xhr响应。
但令人惊讶的是,
1)我从来没有看到“正在加载......”,但我只看到重定向的页面。
2)更改假xhr请求的延迟没有影响,即我仍然得到< 5S
3)将componentWillMount()
更改为componentDidMount()
没有任何影响
4)如果我评论componentWillMount() { ... }
,那么我会看到'正在加载'
你能帮我理解为什么吗?
xhr.js
const myData = {
getData(cb) {
setTimeout(cb(true), 25000); // fake async
}
};
export default myData;
Home.js
"use strict";
import React from 'react';
import xhr from '../../utils/xhr';
import PropTypes from 'prop-types';
import {withRouter} from 'react-router-dom';
class Home extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
const {history} = this.props;
xhr.getData((flag) => {
flag ? history.push('/myData') : history.push('/welcome');
});
}
render() {
return (
<div>Loading ...</div>
);
}
}
Home.propTypes = {
history: PropTypes.object.isRequired
};
export default withRouter(Home);
答案 0 :(得分:2)
您的代码应该可以正常使用componentDidUpdate
,除了一件事,您没有正确运行setTimeout
示例:
const getData = cb => {
setTimeout(() => cb(false), 2500); // fake async
};
class Home extends React.Component {
constructor(props) {
super(props);
this.state = {
pageName: "Loading..."
};
}
componentDidMount() {
getData(flag => {
flag
? this.setState({ pageName: "myData" })
: this.setState({ pageName: "wellcome" });
});
}
render() {
return <div>{this.state.pageName}</div>;
}
}
ReactDOM.render(<Home />, document.getElementById("root"));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
&#13;
<强>更新强>
如下所述,我应该解释为什么以及在哪里调用异步操作。