PromiseRender.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import React from 'react';
  2. import { Spin } from 'antd';
  3. export default class PromiseRender extends React.PureComponent {
  4. state = {
  5. component: null,
  6. };
  7. componentDidMount() {
  8. this.setRenderComponent(this.props);
  9. }
  10. componentWillReceiveProps(nextProps) {
  11. // new Props enter
  12. this.setRenderComponent(nextProps);
  13. }
  14. // set render Component : ok or error
  15. setRenderComponent(props) {
  16. const ok = this.checkIsInstantiation(props.ok);
  17. const error = this.checkIsInstantiation(props.error);
  18. props.promise
  19. .then(() => {
  20. this.setState({
  21. component: ok,
  22. });
  23. })
  24. .catch(() => {
  25. this.setState({
  26. component: error,
  27. });
  28. });
  29. }
  30. // Determine whether the incoming component has been instantiated
  31. // AuthorizedRoute is already instantiated
  32. // Authorized render is already instantiated, children is no instantiated
  33. // Secured is not instantiated
  34. checkIsInstantiation = (target) => {
  35. if (!React.isValidElement(target)) {
  36. return target;
  37. }
  38. return () => target;
  39. };
  40. render() {
  41. const Component = this.state.component;
  42. return Component ? (
  43. <Component {...this.props} />
  44. ) : (
  45. <div
  46. style={{
  47. width: '100%',
  48. height: '100%',
  49. margin: 'auto',
  50. paddingTop: 50,
  51. textAlign: 'center',
  52. }}
  53. >
  54. <Spin size="large" />
  55. </div>
  56. );
  57. }
  58. }