首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有函数参数的自定义钩子的最佳实践接口

带有函数参数的自定义钩子的最佳实践接口
EN

Stack Overflow用户
提问于 2020-09-02 11:40:56
回答 1查看 128关注 0票数 0

我正在创建一个自定义钩子来检测给定HTMLElement内部/外部的单击。

由于钩子接受函数作为参数,因此似乎需要将输入包装在useCallback中,或者用useRef存储在钩子中,以防止useEffect重复触发。

以下两种方法在功能上是否都是相同的?

方法1(首选)

代码语言:javascript
运行
AI代码解释
复制
// CALLER
useClickInsideOutside({
  htmlElement: htmlRef.current,
  onClickOutside: () => {
    // Do something via anonymous function
  },
});

// HOOK
const useClickInsideOutside = ({
  htmlElement,
  onClickOutside,
}) => {
  const onClickOutsideRef = useRef(onClickOutside);

  onClickOutsideRef.current = onClickOutside;

  useEffect(() => {
    function handleClick(event) {
      if (htmlElement && !htmlElement.contains(event.target)) {
          onClickOutsideRef.current && onClickOutsideRef.current();
      }
    }
    document.addEventListener(MOUSE_DOWN, handleClick);
    return () => { document.removeEventListener(MOUSE_DOWN, handleClick); };
  }, [htmlElement]);
}

方法二

代码语言:javascript
运行
AI代码解释
复制
// CALLER
const onClickOutside = useCallback(() => {
  // Do something via memoized callback
}, []);

useClickInsideOutside({
  htmlElement: htmlRef.current,
  onClickOutside,
});

// HOOK
const useClickInsideOutside = ({
  htmlElement,
  onClickOutside,
}) => {
  useEffect(() => {
    function handleClick(event) {
      if (htmlElement && !htmlElement.contains(event.target)) {
        onClickOutside();
      }
    }
    document.addEventListener(MOUSE_DOWN, handleClick);
    return () => { document.removeEventListener(MOUSE_DOWN, handleClick); };
  }, [htmlElement, onClickOutside]);
}

第一个(我更喜欢它,因为它似乎使钩子更容易使用/依赖较少的假设)像我想象的那样工作吗?或者useEffect可能会在handleClick中封装陈旧的函数引用。

EN

回答 1

Stack Overflow用户

发布于 2020-09-02 11:51:48

useCallback是解决这一问题的正确方法。然而,我认为我在设计它的时候,我可以把备忘录从消费者那里抽象出来:

代码语言:javascript
运行
AI代码解释
复制
/**
 * @param {MutableRefObject<HTMLElement>} ref
 * @param {Function} onClickOutside
 */
const useClickInsideOutside = (ref, onClickOutside) => {
  const { current: htmlElement } = ref;

  const onClick = useCallback((e) => {
    if (htmlElement && !htmlElement.contains(e.target)) {
      onClickOutside();
    }
  }, [htmlElement, onClickOutside])

  useEffect(() => {
    document.addEventListener(MOUSE_DOWN, onClick);
    return () => document.removeEventListener(MOUSE_DOWN, onClick);;
  }, [onClick]);
}

由于我已经谈到了设计,所以我会尝试使设计类似于类似的API函数,其中两个参数是间接相关的。我最终会变成这样:

代码语言:javascript
运行
AI代码解释
复制
// Consumer component
const ref = useRef()

useClickOutside(ref, () => {
   // do stuff in here
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63712538

复制
相关文章
vs安装本地nuget包(vs2015离线使用)
今天想在项目中使用RestSharp,不过在nuget控制台中发现要么新版本不支持.net4.0,要么用老版本的下载不下来,最后没办法,在RestSharp网站上下载了离线安装包,怎样安装呢?方法之一,概括而言就是把安装包放在NuGet下载缓存目录下,下面就来打开目录:
全栈程序员站长
2022/07/28
3.1K0
vs安装本地nuget包(vs2015离线使用)
安装Nuget包
项目中添加包:dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
CN_Simo
2022/05/10
1K0
安装Nuget包
Visual Studio 2015 的安装和使用
VS2015 是现在微软公司最新也是最强大的IDE,可以开发C#、C++、VB、Android、iOS等多种语言和平台的应用程序。而且,对应的免费版本VS2015 社区版 也出来了。如果只是为了初学或者是想尝试一下VS的同学,可以下载VS2015社区版来试用一下。
乐百川
2022/05/05
2K0
visual studio 2015安装问题及解决
运行C++程序时提示错误:“计算机中丢失MSVCP140D.dll,尝试重新安装该程序以解决此问题”
用户1396155
2018/08/02
7940
如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
对于.NET开发人员来说,我们已经习惯了VS这个世界上最强大的IDE,所以对他们来说,项目的创建直接利用安装到VS中相应的项目模板即可。当.NET Core跨出了Windows的围栏,正式拥抱其他平台,意味着VS已经不再是唯一的IDE。于此同时,.NET Core充分借鉴了目前非常流行的基于“脚手架(Scaffolding)”的源文件生成方式,在它的核心命令行“dotnet”也添加了脚手架的命令行开关。除此之外,.NET Core真正对社区敞开胸怀,我们可以直接利用现有的脚手架工具Yeoman来生成.NET
蒋金楠
2018/01/15
1.1K0
如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
Visual Studio 2015软件下载和安装教程
Microsoft Visual Studio 2015(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
肉肉软件安装
2022/12/10
2.9K0
Visual Studio 2015软件下载和安装教程
Visual Studio Installer打包安装项目VS2015
使用VS2015的Visual Studio Installer打包安装项目,虽然整体操作很简单,但还是有几个特殊的点需要记一下,故写下此博客方便以后查阅
vv彭
2020/12/21
1.7K0
Visual Studio Installer打包安装项目VS2015
NuGet 修改包路径
通过 NuGet 安装包时,NuGet 先将包下载至一个统一的目录,默认路径是:C:\Users\用户名\.nuget\packages
丹枫无迹
2019/11/20
2.2K0
windows有没有内网nuget源
解决国内访问NuGet服务器速度不稳定的问题 ,这里推荐使用NuGet微软官方中国国内镜像
Windows技术交流
2021/12/30
2.1K0
Visual Studio 2015正式发布
Windows 10 RTM正式版要7月29日发布,微软的另一个重磅软件Visual Studio 2015已经率先发布,今天如期放出了正式版本。Visual Studio 2015包括许多新功能和更新,如通用Windows应用开发工具、面向iOS、Android、Windows的跨平台移动开发工具(包括Xamarin、Apache Cordova、Unity)、可移植C++库、适用于Android的本机活动C++模板等等,对Cordova,Xamarin , C++的跨平台支持都非常好。让你通过一个工具完
张善友
2018/01/19
1.9K0
Visual Studio 2015正式发布
Windows 7 上安装Visual Studio 2015 失败解决方案
安装之前先要看看自己的系统支不支持,具体的可以看:https://www.visualstudio.com/en-us/visual-studio-2015-system-requirements-vs.aspx,直接到 微软官方网站进行下载:https://www.visualstudio.com/downloads/download-visual-studio-vs,也可以看Visual Studio 2015正式发布 中列出的下载地址直接下载,整个的安装过程和Visual Studio 2012,Vi
张善友
2018/01/19
2.1K0
Windows 7 上安装Visual Studio 2015 失败解决方案
VS2015 Visual Assist X 破解版安装教程
安装包下载方法:公众号【视觉IMAX】后台回复「VA助手」,即可得到安装包下载链接。
3D视觉工坊
2020/12/11
2.5K0
VS2015 Visual Assist X 破解版安装教程
使用 Microsoft.Net.Compilers 在旧版本的 Visual Studio 2013/2015/2017 中开启新的 C# 7.x 和 C# 8 语法
新版本的 C# 特性需要新版本的 Visual Studio 的支持。不过,如果你不介意修改项目的话,你也能在低版本的 Visual Studio 中获得高版本的 C# 语言支持了。
walterlv
2023/10/22
5110
Visual Studio 2013 下 NuGet 无法识别自定义包路径的解决方法
升级到 VS2013 之后, 编译时会发现 VS2013 下 NuGet 不能正确识别预先配置好的存放目录, 总是把文件放在解决方案的 packages 目录下, 这个可以说是 NuGet 的 bug , 也可以说是 VS2013 的 bug , 原因是:
beginor
2020/08/10
1.9K0
修改Nuget包默认存放路径
默认情况下所有的Nuget包都会下载到C盘,目前我这边有几十个G的大小,这导致我C盘的容量越来越小…
HueiFeng
2020/06/05
2.9K0
visual studio 2015 warning MSB3246
在我们很高兴的按下 本地计算机运行 按钮,希望看到我们程序运行的时候,垃圾vs就告诉我们,你的程序出现了问题,问题就是: warning MSB3246: 解析的文件包含错误图像、无元数据或不可访问。未能加载文件或程序集“*.dll”或它的某一个依赖项。试图加载格式不正确的程序。 其中*.dll就是一个dll名称,那么遇到这个问题,不是修复vs就能做好的,我找了好久,在堆栈炸了找到一个可以用的方法
林德熙
2022/08/04
4010
阻止某个 NuGet 包意外升级
2018-06-29 09:59
walterlv
2018/09/18
1.4K0
阻止某个 NuGet 包意外升级
visual studio 2015 warning MSB3246
在我们很高兴的按下 本地计算机运行 按钮,希望看到我们程序运行的时候,垃圾vs就告诉我们,你的程序出现了问题,问题就是: warning MSB3246: 解析的文件包含错误图像、无元数据或不可访问。未能加载文件或程序集“*.dll”或它的某一个依赖项。试图加载格式不正确的程序。 其中*.dll就是一个dll名称,那么遇到这个问题,不是修复vs就能做好的,我找了好久,在堆栈炸了找到一个可以用的方法
林德熙
2018/09/18
8170
【开发环境】Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ubuntu 安装 deb 包 )
进入 Visual Studio Code 下载页面 https://code.visualstudio.com/ ;
韩曙亮
2023/03/30
1.5K0
【开发环境】Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ubuntu 安装 deb 包 )
nuget服务器搭建,以及如何发布一个Nuget包
一、本地dll如何打包,以及版本的更新 本小节主要介绍两种方式将本地dll打包为Nuget包, 1.1 利用nuget.exe进行打包(应用于.net framework) 1. 下载nuget.ex
sam dragon
2018/01/17
4.6K0
nuget服务器搭建,以及如何发布一个Nuget包

相似问题

ol.tilegrid.WMTS.WMTSTileGrid不是构造函数

11

导致无法读取未定义的属性

212

默认参数导致无法读取未定义属性?

21

导致:无法读取未定义的属性“product_name”

22

AngularJS - angularAnimate导致错误:无法读取未定义的属性“”

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档