javascript - react : Wait until all assets are loaded

标签 javascript reactjs asynchronous svg

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

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

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

index.js

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

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

loadAllAssets.js

import { ajaxSVG } from './gfAssetsLoader';

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

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);
  }
};

最佳答案

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);
    }
  });
};

现在您可以将 .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'));

关于javascript - react : Wait until all assets are loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46757268/

相关文章:

javascript - 如何使用 redux-form 以编程方式更新字段的状态

ios - 如何在 SwiftUI 中进行异步更新后解雇发布者?

javascript - 使用 javascript 验证动态命名的单选按钮

javascript - 无法通过 Omnivore 加载 CSV 数据

javascript - SharePoint 聊天图标嵌入 iframe 问题

javascript - ReactJS中箭头函数有什么用?

java - 是否有Java,Javascript,Python中用于日历计算的良好框架,可以从公历转换为希伯来语日历?

javascript - ReactjsangerlySetInnerHtml 替代方案

node.js - 返回 POST 请求响应后运行方法

javascript - Typescript 异步函数包装 Promise