React Hook的用法: Ref + useMemo + 自定义Hook(三)

2023-11-06

React Hook的用法
Ref Hook
这个Hook的作用是可以通过他来获取到Dom元素节点,使用起来非常方便。
关键代码如下:

const xxxEle = useRef(initialValue);
1
useRef返回一个ref变量,并接受一个初始值 initialValue 这个传入的初始值会复制给useRef返回变量的 .current 属性上(这里就是 xxxEle.current)。如果没有需要传入的初始值的话,一般直接传入 null 即可,然后就可以将返回的Ref变量附加在具体的dom元素上。类似下面

<div ref={divEle}></div>
1
这样 xxxEle.current 属性就会一直指向该 Dom元素。

那么我们是否能够通过 Ref获取函数子组件呢?就类似在class 组件中父组件通过ref属性获取子组件的实例。答案是不能,因为只有class组件才有实例,函数本身是没有实例对象的。比如看下面这个例子,设计了有一个函数组件,使用同样的方式可以获取对应的 div元素的dom信息,但是却获取不了函数子组件的信息,打开控制台会显示null。

在线Demo

useMemo Hook
一句话概括Memo的作用是把“创建”函数和依赖项数组作为参数传入 useMemo,它仅会在某个依赖项改变时才重新计算 memoized 值。这种优化有助于避免在每次渲染时都进行高开销的计算。

Memo Hook 使用起来和 Effect Hook 非常的相似,关键代码如下:

 useMemo(fn,[params]) 
1
第一个参数是一个执行函数, 该函数(fn)会在该函数组件刚创建的时候执行一次,
后面的参数是一个数组,数组中可以登记该函数组件中的变量,只有在第二个参数登记过的变量变化时才会再次执行fn函数。这就实现了有条件的去执行子组件函数中的部分逻辑了,从而实现减少了性能开销。
下面设计了一个说明该作用的例子。在父组件中控制两个变量 age 和count,并可以通过按钮去改变对应的值。子组件直接接受并展示父组件传递过来的这两个变量。
但是只有当父组件中 age 的值发生改变时,才会运行 ageChange 这个函数
关键代码如下:

import React, { useMemo } from "react";
1
从React 中引入 useMemo这个钩子。
在子组件中:

  const ageVal = useMemo(() => ageChange(age), [age]);
1
子组件使用useMomo这个Hook,并在等二个参数中登记age这个变量,那只有父组件中age变量发生改变的时候才会运行 ageChange的方法,并且该函数经过ageChange业务处理后返回一个值(这里就是age本身)供子函数使用。

在线Demo

自定义Hook
通过前面两篇文章总结了业务中常见的几种React 提供的Hook, 除了React提供的Hook之外,当然开发者也可以根据自身业务场景需要开发出特定的Hook。可以说Hook天生自带轮子光环,用的好的话对平常中的业务开发是非常有用的,这里举一个例子,开发一个监听页面放缩的Hook并返回当前浏览器的尺寸。

在线Demo
————————————————
版权声明:本文为CSDN博主「问白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38080573/article/details/104898950

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Hook的用法: Ref + useMemo + 自定义Hook(三) 的相关文章

  • React 中的变异状态有哪些缺点?

    我有一个带有顶级组件和许多嵌套子组件的 React 应用程序 顶级组件是唯一具有状态的组件 该状态采用单个变量的形式 this state g new BlackJackGame g 包含一个复杂的数据结构 class BlackJackG
  • 如何使用 htaccess 将所有请求重定向到反应或角度索引?

    我正在使用react router 在react 中创建一个应用程序 早些时候 我对 Angular 做了同样的事情 但在这两种情况下 如果用户为 URL 添加书签并直接加载它 它将显示 404 错误 我们可以在 htaccess 中创建这
  • 在 React Web 应用程序中使用 createjs-soundjs

    我想用https www npmjs com package createjs soundjs https www npmjs com package createjs soundjs在 React Web 应用程序上播放声音 我正常安装了
  • 在 Chrome 中使用 React 添加新的 DOM 项目不会保持预期的滚动位置

    在 React 中向状态数组添加新项目时 我遇到了一个意外的问题 这会导致更多项目被添加到 DOM 中 在 Safari 和 Firefox 中 这会导致新的 DOM 项目添加到折叠下方 我必须向下滚动才能看到新项目 在 Chrome 中
  • React App 中的图像损坏

    我正在尝试访问 React 应用程序中的图像 当我运行代码时 我在网页上看到一个损坏的图像图标 我不确定我是否正在访问图像的正确路径 我的代码如下 import React Component from react class Header
  • Jest - 模拟函数,从另一个文件导入

    测试的文件使用从另一个文件导入的函数 import myFunc from myFile 如何在该文件的测试中模拟该函数的返回值 我正在使用笑话 这对我有用 我不确定这是否是一个好的做法 import as myFile from myFi
  • useParams 钩子在 React 功能组件中返回未定义

    该应用程序显示所有照片
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 如何在 Gatsby 页面上包含本地 JavaScript?

    我是一个完全的 React 新手 我想这里有些基本的东西我不太明白 默认的 Gatsby 页面如下所示 有没有办法像这样使用本地 js 文件 我想要实现的是让反应忽略script js但仍然让客户端使用它 默认的 Gatsby 页面看起来像
  • 带换行符的 React/Momentjs 日期格式

    我有一个日期字符串 我想对其进行格式化 其中数字位于月份下 Jul 6 我尝试了几种不同的方法来添加新行
  • 这种类型注释在没有 TypeScript 的 React 代码中如何工作?

    我在看这段代码示例 https reacttraining com react router web example auth workflow在 ReactRouter 页面上 这篇文章很有趣 const PrivateRoute com
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • webpack中动态加载外部模块失败

    我正在尝试建立以下架构 一个核心 React 应用程序 它具有一些基本功能 并且能够在运行时加载其他 React 组件 这些额外的 React 组件可以按需加载 并且它们在构建核心应用程序时不可用 因此它们不能包含在核心应用程序的捆绑包中
  • React 在同一组件中渲染多个模态

    我对 React 和一般编码都很陌生 我试图在同一组件中渲染多个模态 但它们都是同时渲染的 因此看起来所有链接都在最后一个模态中渲染文本 这是状态设置的地方 class Header extends React Component cons
  • ReactJS - Redux Form - 如何根据单选字段元素有条件地显示/隐藏元素?

    我对 Redux 比较陌生 我有一个表单 其中有一些无线电输入 是 或 否 基本上 我想根据该无线电输入选择有条件地显示包含另一个 redux 表单字段的另一个元素 有直接的方法可以做到这一点吗 我想检查一下formProps site v
  • 类型“void”不可分配给类型“((event:MouseEvent) => void) |不明确的'

    import as React from react import App css import PageTwo from components PageTwo export interface IPropsk data Array
  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 在 React Native 中将 Props 传递到屏幕

    我已经开始学习 React Native 并且一如既往地从创建可重用组件开始 我了解了如何在创建自定义组件时传递和访问 props 我想在 React Native 中创建一个基本屏幕 它具有通用属性 并且我的应用程序中的所有屏幕都可以设置

随机推荐

  • 快手java开发面试经验大全

    1 自我介绍 2 java集合 hashmap详细介绍 关键参数 线程安全的集合 队列和栈 用两个栈实现队列算法 3 jvm结构 4 多线程锁 synchronized reentrantlock countdownlatch 锁升级 5
  • 回归(regression)和logistic regression

    回归 回归 就是 回归本质 的意思 用一个函数去拟合一组数据 xi yi x i y i 随着数据越来越多 用来拟合的这个曲线就越来越接近真实的情况 这里 xi x i可以是一个向量 假设 xi Rn x i in R n 若用线性回归的方
  • 如何创建 且在idea中操作vue3项目

    一 使用vue的控制台创建vue3项目 1 首先使用vue的控制台创建基础的vue框架 win r 唤出控制台 输入cmd 在控制台中输入 vue ui 弹出一个网页窗口 在弹出的窗口中点击下面这个地方 选择你要存放的地址 点击再次创建项目
  • Long 类型比较 判断相等问题引发的问题

    项目场景 最近上线以后遇到的一个问题 在这里记录一下 问题描述 测试的时候没问题 放到生产上就有问题了 原因分析 当时在测试上是没问题的 在生产上用同样的环境 同样的数据测试也是没问题的 把生产上数据同步到本地测试了一下 果然有问题 解决方
  • 物联网技术

    作者 阏男秀 链接 https www zhihu com question 50125636 answer 124938067 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 物联网技术之四 无线自组网 无
  • springboot(一):构建最简单的springboot项目

    springboot应该是在spring体系基础上发展起来的 使用springboot 可以快速构建开发项目 并快速集成相关组件 很多开源的组件都有springboot的实现了 有人说它的设计理念为约定大于配置 就是好比说在springbo
  • 为什么Centos装上以后,执行apt-get命令提示没有该命令

    CentOS的软件安装工具不是apt get 是yum yum y install 你要安装的文件
  • java最大堆空间会自动扩增吗_最大化Java堆空间

    我试图在 Java中使用非常大的方阵 n 1e6或更大的数量级 矩阵不是稀疏的 所以我没有看到很多方法将它们表示为2D数组 这需要n 2 sizeof int 位的内存 显然 我正在获得堆溢出错误 即使添加编译器标志来使用我的机器将允许的大
  • 二十九.刷题.19

    输入两点坐标 X1 Y1 X2 Y2 0 lt x1 x2 y1 y2 lt 1000 计算并输出两点间的距离 include
  • centos7.3 32位 安装ssh实现远程登陆

    centos7 3 32位 安装ssh实现远程登陆 安装ssh sudo yum install openssh 关闭防火墙 永久禁用 sudo systemctl disable firewalld 重启ssh sudo systemct
  • 流动的数据——使用 RxJS 构造复杂单页应用的数据逻辑

    感谢作者徐飞的授权发布 作者 徐飞 网名民工精髓V 曾任Teambition前端架构师 苏宁云计算中心前端架构师 有十年以上大型企业应用前端架构及开发经验 熟悉AngularJS等框架 对Web组件化有一些思考 博客地址 https git
  • 微软server2012服务器端客户端,windows server 2012 datacenter配置iSCSI目标服务器和客户端配置...

    您好 1 在添加角色时 添加 文件和存储服务 文件和iSCSI服务 iSCSI目标存储提供程序 VDS和VSS硬件提供程序 这项主要的作用是什么 在配置iSCSI目标服务器时 有没有必要安装 这个应该 是 让 iscsi 卷 支持 VSS
  • gitee配置SSH公钥

    第一步 找个地方打开 git bash 然后输入生成ssh公钥的命令 ssh keygen t rsa C your email 然后敲四次回车生成公钥 第二步 输入查看公钥的命令 cat ssh id rsa pub 结果如下 第三步 将
  • 如何在微信小程序中优雅地发送异步请求

    一 微信小程序运行环境 微信小程序的 javascript 运行环境和浏览器不同 页面的脚本逻辑是在JsCore中运行 JsCore是一个没有窗口对象的环境 所以不能在脚本中使用window 也无法在脚本中操作组件 JsCore中也没有 X
  • ProtoBuf(Google Protocol Buffers)—— C++开发具体教程

    ProtoBuf C 开发 教程 C 开发 教程 1 定义你的 protocol 格式 1 1 protocol 字段格式 1 2 指定字段规则 1 3 proto文件 2 编译你的 Protocol Buffers 3 The Proto
  • 【华为OJ】【在字符串中找出连续最长的数字串】

    题目描述 请一个在字符串中找出连续最长的数字串 并把这个串的长度返回 如果存在长度相同的连续数字串 返回最后一个连续数字串 注意 数字串只需要是数字组成的就可以 并不要求顺序 比如数字串 1234 的长度就小于数字串 1359055 如果没
  • 模板类的特化和类型萃取

    模板类的特化 有时为了需要 针对特定的类型 需要对模板进行特化 也就是所谓的特殊处理 全特化 对传入的数据类型都做了限制 偏特化 半特化 偏特化并不仅仅是指特殊部分参数 而是针对模板参数更进一步的条件限制所设计出来的一个特化版本 模板的全特
  • Linux vim的常见基本操作

    目录 vim是一款多模式的编辑器 命令模式下 用小写英文字母 h j k l 分别控制光标左 下 上 右移一格 gg 定位到代码第一行 n shift g 定位到任意一行 最后一行 移动到光标所在行的结尾 移动到光标所在行的开头 w 以单词
  • Linux之 Shell分析日志文件

    文章目录 前言 1 查看有多少个IP访问及某一个页面被访问的次数 2 查看每一个IP访问了多少个页面及个IP访问的页面数进行从小到大排序 3 查看某一个IP访问了哪些页面及去掉搜索引擎统计的页面 4 查看2015年8月16日14时这一个小时
  • React Hook的用法: Ref + useMemo + 自定义Hook(三)

    React Hook的用法 Ref Hook 这个Hook的作用是可以通过他来获取到Dom元素节点 使用起来非常方便 关键代码如下 const xxxEle useRef initialValue 1 useRef返回一个ref变量 并接受