如何显示装载机的反应。使用钩子

时间:2019-12-25 02:47:18

标签: javascript reactjs react-redux react-hooks react-hook-form

我正在将axioscommunicate一起用于服务器。我想在用户请求服务器时显示加载程序,并在请求完成时隐藏加载程序

因此,我制作了一个自定义组件来执行此任务。但是,当我多次单击同一按钮时,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代码时,它可以很好地工作。

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

我认为我已经在卸载组件时取消分配了axios对象。?

2 个答案:

答案 0 :(得分:0)

我通常使用此代码在处理请求数据时显示加载,并在完成请求时隐藏

const Loader = () => {
   const {data, setdata} = useState([])
  
    useEffect(()=>{
        axios.get('your host').then(res => {
           setdata(res.data);        
        }).catch(err => {
          setdata(res.data);
        }
    });


    return (
        <div>
            {data.length > 0 
            ?
              <div style={{position:"fixed",display:"flex",justifyContent:"center",alignItems:"center",width:'100%',height:'100%',zIndex:999999}}> </div>
             :
             <Spin tip="Loading..." style=        {{zIndex:999999}}>
             </Spin>
        </div>
    );
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

答案 1 :(得分:0)

将空数组添加到useEffect的sencod参数中。
在功能组件中,其作用类似于componentDidMount()

const { useState, useEffect } = React;

const Counter = () => {
  const [count, setCount] = useState(0)
  
  useEffect(() => {
    console.log("aaa");
  }, []); // here

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </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>