javascript - 防止事件连续执行React

标签 javascript reactjs highcharts react-hooks

我有一个具有此状态的父组件,它是一个对象,其中一个属性是一个名为 onScrollbarSelection 的函数,它会发出 axios 帖子。所有这些都将传递给子组件。

子组件使用 Highcharts 中的 API,该 API 的属性之一 ( afterSetExtremes ) 使用父组件 (props) 中的 onScrollbarSelection 函数。问题是 afterSetExtremes 可以连续触发很多次,这使得 onScrollbarSelection 函数也连续执行很多次,并发出大量 axios 帖子,导致浏览器崩溃。

我尝试过在 post 调用上设置超时,但没有成功,它仍然调用使 axios post 多次。如何防止 onScrollbarSelection (或 afterSetExtremes 事件)连续执行很多次?

const Parent = () => {
    const [state,setState] = useState({
        onScrollbarSelection: (e) => {
            var min = new Date(e.min);
            var max = new Date(e.max);
            var minDate = min.getFullYear() + '-' + (min.getMonth() + 1) + '-' + min.getDate();
            var maxDate = max.getFullYear() + '-' + (max.getMonth() + 1) + '-' + max.getDate();
            async function postData() {
                axios.post('url',{
                    start_date: minDate,
                    end_date: maxDate,
                });
            }
            setTimeout(postData(),3000);
        }
    });

    useEffect( () => {
        async function fetchData() {
            var res = await axios.get(url);
            setState({
                ...state,
                data: res.data,
            });
        }
        fetchData();
    },[]);



   return(
        <div>
             <Child config={state}/>
        </div>
   )

};

const Child = (props) => {
    const state = {
        xAxis:{
            events: {
                afterSetExtremes: (e) => { //this triggers a lot of consecutive times
                    props.config.onScrollbarSelection(e);
                }
            }

        }, 
    };

    return (
        <div>
            <HighchartsReact highcharts={Highcharts} constructorType={'stockChart'} options={state} />
        </div>
    );
}

最佳答案

您应该使用具有去抖效果的函数。

const Parent = () => {
  const [data, setDate] = React.useState(); 
  const [state, setState] = React.useState([]);
  
  const afterSetExtremes = React.useCallback(({ min, max }) => {
    setState([min, max]);
  }, []);
  /* create option for HighchartsReact */
  const option = React.useMemo(() => ({
    xAxis: {
      events: {
        afterSetExtremes,
      },
    },
  }), [afterSetExtremes]);
  /* get data from url end set it to data state */
  useEffect( () => {
    axios.get('url')
      .then((res) => {
        setDate(res.data);
      })
  },[]);
  /* do post if state changed, works with debounce 250ms */
  useEffect(() => {
    const handler = setTimeout(() => {
      const [minDate, maxDate] = state.map((value) => {
        const d = new Date(value);
        return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
      });
      
      axios.post('url', { start_date: minDate, end_date: maxDate })
        .then((res) => {})
        .catch((error) => {});
    }, 250);
    
    return () => {
      /* if state changed in 250ms
       * clearTimeout remove handler
       * and axios.post does not call.
       */
      clearTimeout(handler);
    };
  }, [state]);

  return (
    <HighchartsReact
      highcharts={Highcharts}
      constructorType='stockChart'
      options={option}
    />
  );
};

关于javascript - 防止事件连续执行React,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60855259/

相关文章:

javascript - 根据焦点输入显示元素

css - Material-ui makeStyles 默认覆盖

javascript - Material-ui抽屉宽度问题

javascript - Highcharts 部分渲染

javascript - 如何将数据放入一列

javascript - 如何将 Twitch channel 的观看者计数插入到 <p> 标签中?

javascript - 谷歌地图 V3 : Multiple maps on a page resulting in missing markers (DEBUG)?

javascript - highcharts:导出的图像中没有数据

javascript - 未捕获的类型错误无法读取未定义 Javascript 的属性 '0'

JavaScript - 防止父 anchor 元素上的 event.default