如何在 react 中显示加载器。使用钩子

use*_*513 3 javascript reactjs react-redux react-hooks

我正在与服务器一起使用axios。我communicate想在用户请求服务器时显示加载程序并在请求完成时隐藏加载程序

因此,我制作了一个自定义组件来执行此任务。但是当我在同一个按钮上多次单击时,我的 UI 会挂起

const Loader = () => {
    const { loadingCount } = useLoadingState(),
        {showLoading, hideLoading} = useLoadingActions();

    useEffect(()=>{
        const self = this
        axios.interceptors.request.use(function (config) {
            showLoading();
            return config
        }, function (error) {
            return Promise.reject(error);
        });

        axios.interceptors.response.use(function (response) {
            // spinning hide
            // self.props.loading(false)
            hideLoading()
            return response;
        }, function (error) {
            hideLoading();
            return Promise.reject(error);
        });
    })


    return (
        <div>
            {loadingCount > 0 ?<div style={{position:"fixed",display:"flex",justifyContent:"center",alignItems:"center",width:'100%',height:'100%',zIndex:999999}}>
                {/*{loadingCount > 0 ? */}
                <Spin tip="Loading..." style={{zIndex:999999}}></Spin>
                {/*: null}*/}
            </div>: null}
        </div>





    );
};
Run Code Online (Sandbox Code Playgroud)

问题出在 useeffect

当我注释掉 useEffect 代码时,它运行良好。

注意:showloading 和 hideloading 增加和减少加载计数。

我想我已经在卸载组件时释放了 axios 对象。???

Dra*_*ite 6

将空数组添加到 sencod 参数useEffect
它就像componentDidMount()在功能组件中一样工作。

const { useState, useEffect } = React;

const Counter = () => {
  const [count, setCount] = useState(0)
  const [isLoaded, setIsLoaded] = useState(false);
  
  useEffect(() => {
    setTimeout(() => {
      setIsLoaded(true);
    }, 3000);
  }, []); // here

  return (
    <div>
      {
        isLoaded &&
        <div>
          <p>You clicked {count} times</p>
          <button onClick={() => setCount(count + 1)}>
            Click me
          </button>
        </div>
      }
    </div>
  )
}

ReactDOM.render(<Counter />, document.getElementById('app'))
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.7.0-alpha.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.7.0-alpha.2/umd/react-dom.production.min.js"></script>
<div id="app"></div>
Run Code Online (Sandbox Code Playgroud)