反应:等到所有资产都加载完毕

gnz*_*nzg 7 javascript svg asynchronous reactjs

在 React.js 项目中,我componentWillMount()通过名为 的函数在生命周期方法内获取 svgs loadAllAssets()。然后将它们保存在用户的 localStorage 中。

(1) 除了迭代发出的请求数量并将它们与 localStorage 的内容进行比较之外,是否有更优雅的方法来检查所有请求的 svg 文件是否确实已保存在 localStorage 中?

(2) 有没有更好的方法来阻止 componentDidMount 的初始化,只要资源仍在加载而不是将整个代码包装在条件中?我正在使用 Redux,所以我也会想到这一点,但在我看来,就像用大锤敲碎坚果一样。

索引.js

import { loadAllAssets } from './utils/loadAllAssets';

class AppContainer extends React.Component {
  componentWillMount() {
    loadAllAssets();
  }
//...
}
ReactDOM.render(<Provider store={store} ><AppContainer /></Provider>, 
document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)

loadAllAssets.js

import { ajaxSVG } from './gfAssetsLoader';

export const loadAllAssets = () => {
  /* write to localStorage */
  ajaxSVG('closeScene', '/assets/svg/close-scene-ani.svg');
//...
}
Run Code Online (Sandbox Code Playgroud)

gfAssetsLoader.js

export const ajaxSVG = (assetName, path) => {
  try {
    let request = new XMLHttpRequest();
    request.open("GET", path, true);
    request.onload = function (e) {
      if( request.status >= 200 && request.status < 400 ) {
        let data = request.responseText;
        localStorage.setItem(assetName, data);
      } else console.log('Bad request. request status: ' + request.status);
    }
    request.send();
  }
  catch (e) {
    console.log(e);
  }
};
Run Code Online (Sandbox Code Playgroud)

Jes*_*oza 4

1-

export const loadAllAssets = () => {
  /* write to localStorage */
  return ajaxSVG('closeScene', '/assets/svg/close-scene-ani.svg');
  //...
}

export const ajaxSVG = (assetName, path) => {
  return new Promise((resolve, reject) => {
    try {
      let request = new XMLHttpRequest();
      request.open("GET", path, true);
      request.onload = function (e) {
        if( request.status >= 200 && request.status < 400 ) {
          let data = request.responseText;
          localStorage.setItem(assetName, data);
          resolve();
        } else reject('Bad request. request status: ' + request.status);
      }
      request.send();
    }
    catch (e) {
      reject(e);
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

现在您可以将 .then 连接到 loadAllAssets() 并更改那里的状态。

2-要显示加载状态,只需创建一个加载状态,并在数据加载时将其更改为 false,这样它就会在数据加载时显示加载器,加载完成后将显示数据。

import { loadAllAssets } from './utils/loadAllAssets';

class AppContainer extends React.Component {
  constructor() {
    super();

    this.state = {
       loading: false
    };
  }

  componentWillMount() {
    loadAllAssets()
    .then(() => {
      this.setState({ loading: false });
    });
  }
//...
  render() {
    if (this.state.loading) {
       return (
         <div><h1>Loading...</h1></div>
       );
    }

    return (
       //...something else
    );
  }
}
ReactDOM.render(<Provider store={store} ><AppContainer /></Provider>, 
document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)