javascript - 在 HOC 中包装数据获取组件以在加载时显示微调器

标签 javascript reactjs

我有一堆不同的 react 组件通过 api 获取数据,它们每个都有相应的 loadData 操作和 isLoading reducer。我正在尝试编写一个 HOC,它将显示加载微调器而不是组件,直到加载数据并且可以显示组件。

现在 isLoading 为真 -> 微调器呈现 -> isLoading 变为假 -> 子组件呈现 -> 子组件的 componentDidMount() 已执行 -> 这再次调用将 isLoading 设置为 false 的 loadData 操作,依此类推。如何防止这种情况并只调用 loadData 一次?或者也许有更优雅的解决方案?

class DataList extends Component {
  componentDidMount() {
    this.props.loadData(); //action that pulls data via api
  }

  render() {
    return <p>{this.props.data}</p>;
  }
}

const withSpinner = (comp) => (props) => {
  if (props.isLoading) {
    return <p>Loading...</p>
  } else {
    return <comp {...props} />
  }
}

export default connect()(withSpinner(DataList));

// action that fetches data and updates state
const loadData = () => {
  setIsLoading(true);
  data = await fetchData();
  setIsLoading(false);
}

最佳答案

好吧,解决此问题的最简单方法之一是将 dataLoaded 值添加到您维护状态的任何位置,并在您执行以下操作时将其设置为 true已加载您的数据。然后,只需在调用 loadData 之前添加一个检查,这将阻止额外的加载请求。它看起来像这样:

class DataList extends Component {
  componentDidMount() {
    if (!this.props.dataLoaded) { // call it whatever you want
      this.props.loadData(); //action that pulls data via api
    }
  }

  render() {
    return <p>{this.props.data}</p>;
  }
}

const withSpinner = (comp) => (props) => {
  if (props.isLoading) {
    return <p>Loading...</p>
  } else {
    return <comp {...props} />
  }
}

export default connect()(withSpinner(DataList));

// action that fetches data and updates state
const loadData = () => {
  setIsLoading(true);
  data = await fetchData();
  setIsLoading(false);
  setIsLoaded(true);
}

或者,您也可以将 dataLoaded 放在 loadData 函数中,前提是您可以访问其中的状态

关于javascript - 在 HOC 中包装数据获取组件以在加载时显示微调器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43807185/

相关文章:

javascript - 'process.env.NODE_ENV' 替换为字符串或进程对象,可在运行时在 create-react-app 中使用

javascript - 没有 jQuery 的 Animate.css?

javascript - 如何在 javascript 中的 Jquery DataTables 中进行搜索后显示原始的完整数据列表

reactjs - OPTIONS 请求过多

javascript - React 路由器不重定向到组件

javascript - 如何防止第一次重新渲染 Formik

javascript - arcTo 有时不会在调整大小时绘制

Javascript函数改变标题

javascript - 当我们执行诸如 "submit"之类的操作并提供输出时,如何将 javascript 代码与触发的 html 表单合并?

javascript - 如何同时从多个url获取数据?