React Hooks 中 useRef 的介绍及使用场景

前言

React Hooks 是 React 16.8 版本新出的特性,它可以让你在无需修改组件结构的情况下,使用状态(state)和其他 React 特性。其中,useRef 是 React Hooks 中的一个。

在本文中,我们将介绍 useRef 的基本用法,以及一些在 React 中使用 useRef 的常见场景,希望对你学习 React 有所帮助。

什么是 useRef

useRef 是 React Hooks 中的一个函数,它返回一个可变的 ref 对象。它在组件多次渲染之间保持稳定,并且可以用于存储任何可变值,类似于 class 组件中的 this.refs

相比于 useStateuseRef 更适合处理不会引起组件重新渲染的状态,或者需要在函数调用之间存储的任何数据。

使用 useRef

使用 useRef 很简单,只需要在函数组件中调用 useRef,然后将其返回值分配给一个变量即可。例如:

------ ------ - ------- --------- - ---- --------

-------- ------------- -
  ----- ----- - -------------

  ------------ -- -
    ----------------------
  -- ----

  ------ -
    ------ ----------- ----------- --
  --
-

在这个例子中,我们在函数组件中调用了 useRef,并将其返回值分配给了一个变量 myRef。我们将这个变量传递给 ref 属性,然后在 useEffect 中使用 myRef.current 来调用 focus() 方法。

需要注意的是,useRef 返回的值是一个包含 .current 属性的对象,这个属性被初始化为传入 useRef 的参数(如果有的话)。在上面的例子中,我们传入了 null,所以 myRef.current 初始值为 null。我们可以在组件的整个生命周期中读取和修改 .current 属性,而这不会导致组件的重新渲染。

使用场景

引用 DOM 元素或组件

useRef 最常见的用途之一就是获取 DOM 元素或组件的引用。

例如,我们可以在下面的例子中使用 useRef 来获取 button 元素的引用,并在点击后修改 button 的样式:

------ ------ - ------ - ---- --------

-------- ------------- -
  ----- --------- - -------------

  ----- ----------- - -- -- -
    --------------------------------------- - ------
  --

  ------ -
    -----
      ------- --------------- --------------------------- ------------
    ------
  --
-

在这个例子中,我们先调用 useRef 来获取 button 元素的引用,然后将其传递给 ref 属性。最后,我们在 handleClick 函数中使用 buttonRef.current 来修改 button 元素的样式。

存储任意值

除了存储 DOM 元素或组件的引用,useRef 还可以用于存储任意可变值。例如:

------ ------ - ---------- ------ - ---- --------

-------- ------------- -
  ----- ------- --------- - ------------
  ----- ------------ - ---------

  ------------ -- -
    -------------------- - ------
  ---

  ------ -
    -----
      ---------- ------ -----------
      ----------- ------ --------------------------
      ------- ----------- -- -------------- - ------------ --------------
    ------
  --
-

在这个例子中,我们使用 useRef 来存储之前的状态 count。我们创建了一个名为 prevCountRefuseRef,并在 useEffect 中将 prevCountRef.current 的值设置为 count。最后,我们在组件中显示 prevCountRef.current,以显示当前状态和先前状态。

总结

在本文中,我们学习了 useRef 的基本用法,可以将其用于获取 DOM 元素或组件的引用,并存储任意可变值的场景。希望本文对你学习 React 有所帮助。

参考

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/651e933f95b1f8cacd641a68


猜你喜欢

  • 如何在 Vue.js 应用程序中使用 Cypress 进行端到端测试

    Cypress 是一种现代化的前端测试工具,可用于编写端到端测试(E2E)和单元测试。它提供了极佳的可用性和清晰的渐进式 API,让测试变得更简单且可维护。在本文中,我们将讨论如何在 Vue.js 应...

    1 年前
  • 深入剖析 CSS Flexbox 布局在移动端的典型应用

    什么是 CSS Flexbox 布局? Flexbox 布局是指一种基于弹性盒子模型的布局方式,能够高效灵活地处理容器内元素的位置和大小关系,使页面布局更加合理美观。

    1 年前
  • 如何在 Express.js 中使用 Sequelize 进行 ORM 操作

    什么是 ORM? ORM(Object-relational mapping)是一种编程技术,用于将关系型数据库模型映射到面向对象编程语言中。ORM 将数据库操作抽象为对象和方法,使得开发者可以通过常...

    1 年前
  • Koa 应用中的 error 事件处理方式

    在 Koa 应用开发中,我们经常会遇到异常错误,不恰当的处理方式会影响应用的稳定性和用户体验。因此,对于异常错误的处理方式需要特别关注。在 Koa 中,我们可以通过对 error 事件的处理来捕捉和处...

    1 年前
  • 使用 Hapi 框架搭建 RESTful API 的教程

    本文将介绍如何使用 Hapi 框架来搭建一个完整且可扩展的 RESTful API,我们将会覆盖以下主题: Hapi 简介 安装和创建 Hapi 项目 路由和请求处理 参数验证 数据库集成 分层架构...

    1 年前
  • Docker 运行时出现 “Error response from daemon: Conflict” 错误的解决方法

    在使用 Docker 进行前端开发时,我们可能会遇到一些问题。其中一个常见的问题就是运行 Docker 容器时出现 “Error response from daemon: Conflict” 错误。

    1 年前
  • 如何使用 Server-sent Events(SSE) 技术实现图表实时刷新

    在前端开发中,实时更新数据和图表是很常见的需求。传统的方式是使用 AJAX、WebSocket 等技术。但是,这些技术都需要自己编写很多的代码来实现通信和数据更新。从而增加了开发复杂度和工作量。

    1 年前
  • TypeScript 中如何使用类装饰器切面编程

    随着前端开发的不断发展,越来越多的开发者开始使用 TypeScript 进行开发。TypeScript 是一种由微软开发的开源编程语言,是 JavaScript 的超集,它添加了可选的静态类型和其他一...

    1 年前
  • 如何在 Material Design 中应用各种不同的颜色?

    Material Design 是 Google 推出的一种设计语言,它强调简洁、直观且统一的用户体验。在 Material Design 中,颜色是非常重要的元素之一,它可以传达信息、强调重点并影响...

    1 年前
  • ES7 的字符串填充方法(padStart 和 padEnd)详解

    在这个前端快速发展的时代,如何更加高效、简便地操作字符串是很多开发者关注的一个问题。因此,ES7推出了两种新的字符串填充方法 — padStart和padEnd,它们可以快速便捷地进行字符串填充,解决...

    1 年前
  • Babel 编译 ES6 代码遇到的 6 个常见错误及解决方案

    ES6(也就是 ECMAScript 2015)引入了许多新的语法特性,如箭头函数、let 和 const、模板字符串等等,极大地丰富了 JavaScript 的表达能力。

    1 年前
  • Enzyme:React 项目中的组件单元测试详解

    在前端开发中,对于 React 项目的组件单元测试来说,Enzyme 是一个非常重要的工具。Enzyme 是 Airbnb 开发的 React 测试工具,是由 React 的核心团队所推荐使用的测试工...

    1 年前
  • Custom Elements 实战:教你如何构建自定义的时间选择器

    前言 对于前端开发者来说,自定义元素是一个很有用的工具,可以用来解决诸如样式复用、交互性、可维护性等问题。Custom Elements 是一个 Web 标准,可以定制 HTML 标签并创建自定义元素...

    1 年前
  • Mongoose 中如何使用子文档实现嵌套的数据存储

    在开发中,我们通常需要存储一些复杂的数据,其中一些数据可能会包含嵌套的关系。对于这种情况,我们可以使用 Mongoose 中的子文档来实现嵌套的数据存储。 什么是子文档 子文档是指一种嵌套在文档中的文...

    1 年前
  • Next.js 中使用 less 文件进行样式开发

    前言 样式开发一直是前端领域中的重要组成部分,随着技术的发展和需求的增加,CSS 的预处理器越来越流行。Less 是一种 CSS 预处理器,它允许开发者使用类似编程语言的语法来编写 CSS。

    1 年前
  • SASS 中的 @extend 继承技术教程

    在前端开发中,样式常常需要维护和更新,而 SASS 中的 @extend 继承技术可以帮我们实现样式的重用,减少样式代码的冗余。本文将介绍 SASS 中的 @extend 继承技术的使用方法,以及一些...

    1 年前
  • Web Components 开发中如何实现跨域请求

    Web Components 开发中如何实现跨域请求 随着 Web 技术的快速发展,Web Components 成为了前端开发中的关键性技术。Web Components 不仅可以让你设计和建立自己...

    1 年前
  • Vue.js 中如何使用 provide/inject 实现组件跨层级通信

    在 Vue.js 中,组件是构建应用程序的基本单元。我们可能会遇到不同层级之间需要进行通信的情况。Vue.js 提供了 provide 和 inject 这两个 API 帮助我们实现组件间的跨层级通信...

    1 年前
  • 响应式设计如何解决 “图片被拉伸” 问题?

    响应式设计如何解决 “图片被拉伸” 问题? 在进行响应式设计时,我们可能会遇到一个常见的问题,就是图片因尺寸不同而被拉伸或裁切。这对于用户体验来说可能会造成一定的影响,因此我们需要寻找解决方案。

    1 年前
  • 使用 ES8 中的 Object.getOwnPropertyDescriptors() 方法解决属性定义的不可枚举和不可写问题

    在前端开发中,我们常常需要定义一些对象属性来存储数据或者设置特定的逻辑。然而,在属性定义的过程中,不可枚举和不可写问题可能会让我们遇到一些麻烦。这时候,ES8 中的 Object.getOwnProp...

    1 年前

相关推荐

    暂无文章