javascript - 如何在 react 中显示加载程序。使用钩子(Hook)

标签 javascript reactjs react-redux react-hooks

我正在使用 axios 与服务器进行通信。我想在用户向服务器请求时显示加载程序,并在请求完成时隐藏加载程序

所以我制作了一个自定义组件来完成此任务。但是当我多次单击同一个按钮时我的 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>





    );
};

问题出在 useeffect

当我注释掉 useEffect 代码时,它完美地工作。

注意:显示加载和隐藏加载会增加和减少加载次数。

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

最佳答案

将空数组添加到 useEffect 的 sencod 参数中。
它的工作原理类似于功能组件中的 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'))
<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>

关于javascript - 如何在 react 中显示加载程序。使用钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474818/

相关文章:

javascript - 如何处理 reducer 中的异步 promise

javascript - 在react js中渲染具有n个级别的目录结构数据

javascript - 如何使图像 : enlarge when small, 在大时保持居中

javascript - 无法在 JavaScript 中获取单选按钮值

c# - jquery 和 ASP.Net AJAX 框架

javascript - Redux - 应用程序状态以 reducer 的名称作为键

javascript - 根据单击该行中的按钮突出显示或删除该行

javascript - 当我们点击一​​个按钮时,我们如何显示隐藏的段落?

reactjs - 根据badgeContent中的内容操纵Material UI/React Badge组件的可见性

javascript - 如何根据复选框选择呈现列表?