当前位置: 首页 > 知识库问答 >
问题:

typescript - react hooks 如何有效的解决闭包问题?

孔冥夜
2023-07-14

请教一下,闭包在 react 中不注意就会产生,尤其是传递 方法的时候,有什么解决闭包的方法吗?

共有4个答案

籍光熙
2023-07-14
  1. 过期闭包只能通过给 hooks 增加正确的依赖项来解决
  2. 对于函数可以基于 useCallback 封装一下,让外部调用的时候可以不用关心依赖项的问题,大体上可以这样实现:

    import { useCallback, useRef } from 'react';export default function useEvent(handler) { const ref = useRef(handler); ref.current = handler; return useCallback((...args) => {     ref.current?.(...args); }, []);}

    利用 ref 实现一个动态的函数引用

吴经略
2023-07-14

针对函数,通过 useRef 做一次记录,以保证在任何地方都能访问到最新的函数。

const fnRef = useRef(fn);fnRef.current = fn;

代码如下:

function useMemoizedFn<T extends noop>(fn: T) {  const fnRef = useRef<T>(fn);  fnRef.current = useMemo(() => fn, [fn]);  const memoizedFn = useRef<PickFunction<T>>();  if (!memoizedFn.current) {    memoizedFn.current = function (this, ...args) {      return fnRef.current.apply(this, args);    };  }  return memoizedFn.current as T;}
逄俊力
2023-07-14

没有踩过这个坑的。不算使用过react。

洪鹏海
2023-07-14

1.用依赖数组:在 useEffect 或者 useCallback 里,可以通过提供一个依赖数组来通知 React 哪些变量的变化应该触发函数的重新执行。

useEffect(() => {  // 函数会在 count 变化时重新执行  console.log(count);}, [count]);

2.用 ref 在整个组件生命周期内保持不变,但它的 current 属性可以存储可变的值。

const countRef = useRef(count);countRef.current = count;useEffect(() => {  const id = setInterval(() => {    console.log(countRef.current); //引用最新的 count  }, 1000);  return () => clearInterval(id);}, []); // 空依赖数组,函数只在组件挂载时执行一次

3。用函数式更新:

const [count, setCount] = useState(0);// 错误的更新方式,可能会引用旧的 countconst increment = () => setCount(count + 1);// 正确的更新方式,总是基于最新的 countconst increment = () => setCount(prevCount => prevCount + 1);
 类似资料:
  • 本文向大家介绍如何解决vue打包vendor过大的问题?相关面试题,主要包含被问及如何解决vue打包vendor过大的问题?时的应答技巧和注意事项,需要的朋友参考一下 1、在webpack.base.conf.js新增externals配置,表示不需要打包的文件,然后在index.html中通过CDN引入 2、使用路由懒加载 官网

  • 问题内容: 我正在Netbeans中开发一个小型桌面应用程序。这是我的第一个程序,我正面临一种非常奇怪的错误类型。我知道我做错了什么,但无法追踪我做错了什么:( 请帮助我解决此错误。 说明:我有一个默认软件包,并根据需要在此软件包中创建新的Java类。与其他课程一起,我做了一个这样的课程: 现在,我需要在同一包中存在的其他某个类中创建内部类之一的实例,如下所示: 但我收到以下错误: 需要包含XY的

  • 本文向大家介绍解决layer.prompt无效的问题,包括了解决layer.prompt无效的问题的使用技巧和注意事项,需要的朋友参考一下 使用H-UI框架中的layer弹出层时发现 layer.js中没有layer.prompt,如果想要使用layer.prompt可以使用layer中的use从扩展中加载此扩展方法 代码如下: 之后就可以正常使用了。 以上这篇解决layer.prompt无效的问

  • vite.config.js的代理配置失效 问题描述:一个前后端分离项目,前端为vue3+vite4项目, 我提供的后端接口为7002,url为http://localhost:7002/user/info 我在vite.config.js做了代理的配置,这个配置一直不生效, 实际请求路径一直是http://localhost:4000/user/info,一开始请求失败404,后来莫名其妙请求成

  • 当我尝试运行应用程序时,它工作正常。但是当我构建签名apk时,出现了错误 失败:构建失败,出现异常。 问题:任务“:app:lintVitalRelease”的执行失败 无法解析配置“:image_picker_android:调试单元测试运行时类路径”的所有项目。无法转换 bcprov-jdk15on-1.68.jar (org.bouncycastle:bcprov-jdk15on:1.68)

  • 本文向大家介绍vue动画打包后失效问题的解决方法,包括了vue动画打包后失效问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 webpack 打包后动画未执行, 就是npm run build后在dist中生成的项目中动画未生效 解决: 找到build文件夹中 得vue-loader.conf.js,把extract的值改为false---如图 下面看下vue-cli 打包后自定义动画未执行