【问题标题】:Loading the component on react js在 react js 上加载组件
【发布时间】:2020-11-18 17:33:45
【问题描述】:

我在 React 上使用单页应用程序,但我遇到了函数问题,因此返回结果并呈现它需要一些时间。有了这个我想问我是否可以将它更改为异步函数以在它返回后获取结果,但其他组件也不会卡住。

我可能会误解它应该如何工作,但这是我的问题的基本示例:

class Example extends React.Component {

  state = {
    data: "whatever"
  }

  myHeavyFunction(data){
    //while this function works whole page on browser freezes for 3-5 second
    return (<div>{result}</div>);
  }

  buttonClicked(){
    this.setState({data: "new whatever"});
  }

  render(){
    return(
      <div>{this.myHeavyFunction(this.state.data)}</div>
    );
  }

}

我没有使用任何 API 请求,它只是一个处理大数据的函数。 在我的情况下,“myHeavyFunction”是一个不同的组件,我尝试使用 React.lazy/Suspense,但不幸的是它仅在您刷新页面时加载。

所以我想要在单击按钮后与加载微调器异步呈现的功能,这样页面不会刷新,其他组件也不会冻结。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您可以将myHeavyFunction 转换为返回Promise,并且在任何处理程序中,您可以使用Promise 链,或者将处理程序设为async 函数并等待返回值。将此与一些“加载”状态结合起来,您可以显示加载指示器。

    class Example extends Component {
      state = {
        data: "whatever",
        loading: false, // <-- loading state
      };
    
      myHeavyFunction = () => {
        return new Promise(resolve => {
          setTimeout(() => resolve("new whatever"), 5000); // <-- "expensive cmoputation"
        });
      };
    
      buttonClicked = async () => { // <-- async function
        this.setState({
          loading: true // <-- loading true
        });
        const data = await this.myHeavyFunction(); // await expensive computation
        this.setState({
          data,
          loading: false // <-- loading false
        });
      };
    
      render() {
        const { data, loading } = this.state;
        return (
          <div>
            <div>{loading ? "loading..." : data}</div> // <-- conditional render
            <button onClick={this.buttonClicked}>Update</button>
          </div>
        );
      }
    }
    

    【讨论】:

    • 我同意加载指示器部分。对于第二部分,是不是因为让它返回一个 Promise 使它脱离了事件循环,使它不阻塞它?
    • @Selçuk 基本上,是的。它从主线程中卸载它,因此不会阻塞它。
    • 但不是 JavaScript 单线程的。你的意思的线程有点不同,对吧?这是否意味着刚刚脱离事件循环?
    • @Selçuk JS 是单线程的,是的,但这会将代码/回调/等放入由事件循环处理的队列中,因此它是非阻塞的。
    • 非常感谢,听起来事件循环实际上是与 js 线程分开的,需要进一步阅读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2017-03-29
    • 2022-07-21
    相关资源
    最近更新 更多