JS在新函数调用之前清除前一个函数调用的计时器
JS clear timer of previous function call before new function call
我的 React 应用程序使用来自 Material UI 的滑块组件。它的 onChange 事件调用一个函数来更新状态。我意识到我的组件会为每个滑块步骤重新呈现,这就是为什么我想在上次移动滑块后将状态更新延迟大约 300 毫秒。
我的方法是启动一个计时器,通过 onChange 更新状态。当再次调用 onChange 时,应该取消之前的计时器。这是我还在纠结的部分。
setSliderValue 是一个函数,它接受一个数字来更新状态。 如何只在再次调用 sliderChangeHandler 时清除“计时器”?
const [sliderValue, setSliderValue] = useState(20);
const sliderChangeHandler = (event, newValue) => {
const timer = setTimeout(setSliderValue, 300, newValue);
clearTimeout(timer);
};
您应该在您所在的州设置 setTimeout
return 值:
const [sliderValue, setSliderValue] = useState(20);
const [timer, setTimer] = useState();
const sliderChangeHandler = (event, newValue) => {
clearTimeout(timer);
const newTimer = setTimeout(setSliderValue, 300, newValue);
setTimer(newTimer);
};
我建议您使用这个库来消除任何函数的抖动:https://github.com/xnimorz/use-debounce
你的情况是:
const [sliderValue, setSliderValue] = useState(20);
const debounced = useDebouncedCallback(
// function
setSliderValue,
// delay in ms
300,
);
// some part of the code
debounced.callback(30);
在这种情况下,每次调用 debounced.callback
都会取消之前的调用
我通常使用 useRef
钩子来去抖动。类似于:
const timeoutRef = useRef(null)
const [sliderValue, setSliderValue] = useState(20)
const onChange = (e, v) => {
clearTimeout(timeoutRef.current)
timeoutRef.current = setTimeout(setSliderValue, 300, v)
}
节省一行代码;)
我的 React 应用程序使用来自 Material UI 的滑块组件。它的 onChange 事件调用一个函数来更新状态。我意识到我的组件会为每个滑块步骤重新呈现,这就是为什么我想在上次移动滑块后将状态更新延迟大约 300 毫秒。
我的方法是启动一个计时器,通过 onChange 更新状态。当再次调用 onChange 时,应该取消之前的计时器。这是我还在纠结的部分。
setSliderValue 是一个函数,它接受一个数字来更新状态。 如何只在再次调用 sliderChangeHandler 时清除“计时器”?
const [sliderValue, setSliderValue] = useState(20);
const sliderChangeHandler = (event, newValue) => {
const timer = setTimeout(setSliderValue, 300, newValue);
clearTimeout(timer);
};
您应该在您所在的州设置 setTimeout
return 值:
const [sliderValue, setSliderValue] = useState(20);
const [timer, setTimer] = useState();
const sliderChangeHandler = (event, newValue) => {
clearTimeout(timer);
const newTimer = setTimeout(setSliderValue, 300, newValue);
setTimer(newTimer);
};
我建议您使用这个库来消除任何函数的抖动:https://github.com/xnimorz/use-debounce
你的情况是:
const [sliderValue, setSliderValue] = useState(20);
const debounced = useDebouncedCallback(
// function
setSliderValue,
// delay in ms
300,
);
// some part of the code
debounced.callback(30);
在这种情况下,每次调用 debounced.callback
都会取消之前的调用
我通常使用 useRef
钩子来去抖动。类似于:
const timeoutRef = useRef(null)
const [sliderValue, setSliderValue] = useState(20)
const onChange = (e, v) => {
clearTimeout(timeoutRef.current)
timeoutRef.current = setTimeout(setSliderValue, 300, v)
}
节省一行代码;)