当前位置: 首页 > 面试题库 >

如何在React Hook中使用油门或反跳?

滑骞尧
2023-03-14
问题内容

我正在尝试throttlelodash功能组件中使用该方法,例如:

const App = () => {
  const [value, setValue] = useState(0)
  useEffect(throttle(() => console.log(value), 1000), [value])
  return (
    <button onClick={() => setValue(value + 1)}>{value}</button>
  )
}

由于内部方法useEffect在每次渲染时都重新声明,因此限制效果不起作用。

有没有人有一个简单的解决方案?


问题答案:

经过一段时间后,我相信setTimeout/clearTimeout使用功能性助手(并将其移动到单独的自定义挂钩中)比使用功能性助手要容易得多。在稍后处理一个挑战之后,我们立即将其应用到useCallback由于依赖关系更改而可以重新创建的挑战中,但是我们不想重置延迟运行。

下面的原始答案

您可能(可能需要)useRef在渲染之间存储值。就像对计时器的建议一样

像这样

const App = () => {
  const [value, setValue] = useState(0)
  const throttled = useRef(throttle((newValue) => console.log(newValue), 1000))

  useEffect(() => throttled.current(value), [value])

  return (
    <button onClick={() => setValue(value + 1)}>{value}</button>
  )
}

至于useCallback

它可能也可以工作

const throttled = useCallback(throttle(newValue => console.log(newValue), 1000), []);

但是,如果我们尝试重新创建回调,则一旦value更改:

const throttled = useCallback(throttle(() => console.log(value), 1000), [value]);

我们可能会发现它不会延迟执行value更改后,回调将立即重新创建并执行。

因此,我发现useCallback在延迟运行的情况下不会提供明显的优势。由你决定。

[UPD]最初是

  const throttled = useRef(throttle(() => console.log(value), 1000))

  useEffect(throttled.current, [value])

但是这种方式throttled.current已经value通过闭包绑定到初始(0)。因此,即使在下一个渲染中也从未改变过。

因此,useRef由于闭包功能,在将函数推入时要小心。



 类似资料:
  • 我已经花了几天时间,但找不到在RxJS中实现“独特节流”的方法。 假设每个事件以4个破折号完成,一个“不同的油门”将执行如下操作: -①-②-①---------①-----|- [明显的油门] -①-②-------------①-----|- 如何使用现有的RxJS操作符构建“独特的节流阀”?

  • 我有一个带有函数的简单点击事件,我尝试使用进行节流。在中,每次单击我的,油门似乎都不起作用,但当我使用debounce时,它就起作用了。 问题是每次点击和同时增加,但按预期工作,它等待和更新。 工作现场演示

  • 问题内容: 我有一个maxmemory_human 6.05 G和used_memory_human的Redis集群:4.62M 我想用转储数据来补充这个used_memory_human,所以我将有2G的used_memory_human 我该怎么办? 问题答案: 填充 used_memory_human:1.81G 清洁 used_memory_human:574.41K

  • 油画滤镜允许您将照片转换为具有经典油画视觉效果的图像。借助几个简单的滑块,您可以调整描边样式的数量、画笔比例、描边清洁度和其他参数。 将照片(上图)转换为经典油画(下图) 近距离观察图画 使用油画滤镜 选择“滤镜”>“风格化”>“油画”以使用该滤镜。您可以调整滤镜的以下设置: 画笔滑块 描边样式 调整描边样式,范围从涂抹效果 0 至平滑描边 10 描边清洁度 调整描边长度,范围从最短最起伏 0 至

  • 问题内容: 因此,我在这里已经读到,在Vue.js中,可以使用或在选择器中创建适用于子组件内部元素的样式规则。但是,无论是在SCSS还是普通的旧CSS中,尝试以我的样式使用它均无效。而是将它们原样发送到浏览器,因此无效。例如: home.vue: 生成的CSS: 我想要的是: 我与之相关的webpack配置如下所示: 所以我的问题是,如何让该操作员工作? 我已经找到了这个答案,但我确实在这样做,而

  • 在我的项目中,当我只需单击主页上的“加入房间”按钮时,它会将我指向特定的房间。以房间号为例;它发生在xPOgk21523aqPW上,它通过一个像localhost:3000/room/xPOgk21523aqPW这样的扩展来实现。当我进行重定向时,我所在组件的名称是Player。我想要的是,当我将Homapage.js重定向到Player.js时,能够使用Player.js中的代码“xPOgk21