手柄滚动事件将经常触发。减慢/反跳的方法是什么? 而且,如果可能的话,我希望上一个事件总是被触发而不被跳过。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<section class="banners mb-4">
<div class="container">
<div class="d-flex flex-column flex-sm-row justify-content-between">
<div class="banner col m-2"></div>
<div class="banner col m-2"></div>
<div class="banner col m-2"></div>
</div>
</div>
</section>
这是xnimorz
中的useDebounce挂钩示例 const handleScroll = event => {
//how to debounse scroll change?
//if you will just setValue here, it's will lag as hell on scroll
}
useEffect(() => {
window.addEventListener('scroll', handleScroll)
return () => {
window.removeEventListener('scroll', handleScroll)
}
}, [])
答案 0 :(得分:3)
使用钩子的事件处理程序可以与具有任何反跳实现的任何其他函数相同的方式来反跳。 Lodash:
const updateValue = _.debounce(val => {
setState(val);
}, 100);
const handleScroll = event => {
// process event object if needed
updateValue(...);
}
请注意,由于React合成事件的工作原理,event
对象如果在事件处理程序中使用,则需要进行同步处理。
最后一个事件总是被触发且不会被跳过
预计去抖动功能仅考虑最后一次调用,除非实现允许对此进行更改,例如Lodash debounce
中的leading
和trailing
选项。
答案 1 :(得分:1)
const debounceLoadData = useCallback(debounce((debounceValue)=>{
props.setSenderAddress(debounceValue)
}, 300), []);