reactjs - 在 useEffect 中去抖动/限制 onChange 事件
问题描述
如何去抖动/限制由 scrollY.onChange() 调用的函数?
我猜可以使用 Lodash。
这是我的自定义钩子,用于检查用户是否向上或向下滚动:
import { useState, useEffect } from "react";
import { useViewportScroll } from "framer-motion";
const scrollScreen = () => {
const { scrollY } = useViewportScroll();
const [hidden, setHidden] = useState(false);
function update() {
if (scrollY?.current < scrollY?.prev) {
console.log("SHOW");
setHidden(false);
} else if (scrollY?.current > 100 && scrollY?.current > scrollY?.prev) {
setHidden(true);
}
}
useEffect(() => {
return scrollY.onChange(() => update());
});
return [hidden, setHidden];
};
export default scrollScreen;
解决方案
使用 lodash 的油门创建一个新函数,并使用以下命令对其进行记忆useMemo
:
import { useState, useEffect, useMemo } from "react";
import { useViewportScroll } from "framer-motion";
import { throttle } from "lodash";
const scrollScreen = () => {
const { scrollY } = useViewportScroll();
const [hidden, setHidden] = useState(false);
const update = useMemo(() => throttle(() => {
if (scrollY?.current < scrollY?.prev) {
console.log("SHOW");
setHidden(false);
} else if (scrollY?.current > 100 && scrollY?.current > scrollY?.prev) {
setHidden(true);
}
}, 100), []);
useEffect(() => {
scrollY.onChange(update);
}, [update]);
return [hidden, setHidden];
};
export default scrollScreen;
推荐阅读
- android-studio - 如何在 Windows 上查看 couchbase lite 数据库?
- svn - 为什么在同一版本的 repro 上两个 svnrdump 不同?
- javascript - 如果选择了值,则将多选视为单选
- html - 为什么我的表格不再适用于背景?
- python - 如何匹配字符串,只修改原句的一部分?
- java - 使用异步函数分配全局变量
- postgresql - 错误:列“tickets.created_at”必须出现在 GROUP BY 子句中或在聚合函数中使用
- ruby-on-rails - 测试 ActionController::BadRequest 的异常消息
- php - 如何在柱形图中的 3d amcharts 版本 3 上制作 onclick 事件
- python - 谁能解释一下这个“语法”变量的含义以及“nltk.RegexpParser()”的功能是什么?