react中利用useRef、forwardRef、useImperativeHandle获取并处理dom

news2024/12/24 17:32:58

React如何给组件设置ref属性,如果直接绑给组件,代码如下:

import { useRef } from "react"

function MyInput() {
	return (
		<input type="text"/>
	)
}

function App() {
  const myRef = useRef(null)
  const handleClick = () => {
    ref.current.style.background = "red"
    ref.current.focus()
  }
  return (
  	<div>
    	<button onClick={handleClick}>点击</button>
      <MyInput ref={myRef}></MyInput>
    </div>
  )
}

此时点击按钮,发现无法正确拿到MyInput组件中的input元素,并且控制台报错。因为MyInput函数作用域中并没有绑定ref。

在这里插入图片描述

根据提示,需要使用forwardRef(),写法如下:

import { useRef,forwardRef } from "react"

const MyInput = forwardRef(function MyInput(props,ref) {
	return (
		<input type="text" ref={ref}/>
	)
})

function App() {
  const myRef = useRef(null)
  const handleClick = () => {
    ref.current.style.background = "red"
    ref.current.focus()
  }
  return (
  	<div>
    	<button onClick={handleClick}>点击</button>
      <MyInput ref={myRef}></MyInput>
    </div>
  )
}

但上述写法会将MyInput组件中的input全部暴露出来,导致在其他组件中,可以对该元素进行任意操作,如果仅想对外提供某些功能,需要修改为如下写法:

import { useRef,forwardRef,useImperativeHandle } from "react"

const MyInput = forwardRef(function MyInput(props,ref) {
  // 添加如下
  const inputRef = useRef(null)
  useImperativeHandle(ref,()=>{
  	return {
      // 自定义方法
      focus(){
				inputRef.current.focus()
      }
   	}
  })
	return (
		// <input type="text" ref={ref}/>
    <input type="text" ref={inputRef}/>
	)
})

function App() {
  const myRef = useRef(null)
  const handleClick = () => {
    ref.current.style.background = "red"
    ref.current.focus()
  }
  return (
  	<div>
    	<button onClick={handleClick}>点击</button>
      <MyInput ref={myRef}></MyInput>
    </div>
  )
}

再次点击,可以发现只有focus会触发,背景色不会修改且控制台会有提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1085103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一次汇报相关问题

深度学习现在已经学习到了Mini-Batch&#xff0c;early-stop等针对特定场景优化的算法了。 代码已经实现了一个L层的神经网络的构建了 论文看了一些综述 主要思考的两个方向&#xff1a;云计算和嵌入式 云计算&#xff1a;分布式机器学习、联邦学习、服务器负载均衡等 嵌入式&…

安卓wakelock机制

安卓wakelock机制 1.Wakelock作用2.WakeLock锁分类3.WakeLock的级别level 1.Wakelock作用 当手机灭屏状态下保持一段时间后&#xff0c;系统会进入休眠&#xff0c;这时&#xff0c;Android系统中CPU会保持在一个相对较低的功耗状态&#xff0c;一些后台运行的任务就可能得不到…

扁圆头带榫螺栓

声明 本文是学习GB-T 15-2013 扁圆头带榫螺栓. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了螺纹规格为M6&#xff5e;M24、 产品等级为C 级的扁圆头带榫螺栓。 2 规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是…

TypeError: safe_load() missing 1 required positional argument: ‘stream‘

诶&#xff0c;就很简单的问题&#xff0c;原因就是忘了加上需要读取到哪个文件这个参数&#xff0c;救命

区块链游戏的开发流程

链游&#xff08;Blockchain Games&#xff09;的开发流程与传统游戏开发有许多相似之处&#xff0c;但它涉及到区块链技术的集成和智能合约的开发。以下是链游的一般开发流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

2023年DDoS攻击暴增170%:美国、中国和印度是重灾区

根据网络安全厂商StormWall近日发布的《2023年一季度全球DDoS攻击综合报告》&#xff0c;2023年一季度DDoS攻击与2022年同期相比增长了47%。 DDoS攻击呈现三大趋势 调查结果显示DDoS攻击呈现三大趋势&#xff1a;僵尸网络再次兴起、针对关键基础设施&#xff0c;以及越来越多…

openGauss学习笔记-97 openGauss 数据库管理-访问外部数据库-dblink

文章目录 openGauss学习笔记-97 openGauss 数据库管理-访问外部数据库-dblink97.1 编译dblink97.2 常用的dblink函数97.3 注意事项 openGauss学习笔记-97 openGauss 数据库管理-访问外部数据库-dblink openGauss的fdw实现的功能是各个openGauss数据库及远程服务器&#xff08;…

快速数据处理:根据多字段查找重复记录及删除多余记录

目录 为什么要处理重复记录 1 查询重复记录 2 查询重复记录使用的控件及代码 3 删除重复记录 4 导出数据 为什么要处理重复记录 如果一个数据集中含有重复记录&#xff0c;可能需要仅仅保留一条记录&#xff0c;清理掉多余的记录。重复记录的定义&#xff0c;可能仅根据一…

架构师成长路线图

成长为软件架构师不是一件容易的事&#xff0c;这篇文章列举了架构师需要学习的技术储备&#xff0c;给出了成为软件架构师的路线图&#xff0c;帮助有志于在架构领域成长的同学可以明确学习的方向。原文&#xff1a;Master Plan for becoming a Software Architect[1] Danist …

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

苹果FindMy

随着科技的不断发展&#xff0c;人们的生活越来越离不开各种电子设备。然而&#xff0c;随着设备的增多&#xff0c;如何有效地管理和追踪这些设备成为了一个日益突出的问题。针对这一问题&#xff0c;苹果公司推出了一款名为“Find My”的应用程序&#xff0c;为全球的苹果用户…

Blender:渲染一个简单动画

接上 Blender&#xff1a;对模型着色_六月的翅膀的博客-CSDN博客 目标是做一个这种视频 先添加一个曲线&#xff0c;作为相机轨迹 然后添加一个相机 对相机添加物体约束&#xff0c;跟随路径&#xff0c;选择曲线&#xff0c;然后点击动画路径 假如对相机设置跟随路径后&…

新闻软文稿件媒体发布怎么做?纯干货

新闻软文稿件需要投放在正确的媒体上&#xff0c;才能获得更好的宣传推广效果&#xff0c;新闻软文稿件媒体发布怎么做&#xff1f;今天伯乐网络传媒就来给大家讲解一下&#xff0c;纯干货&#xff0c;建议收藏起来慢慢看。 一、媒体选择与分析 1. 确定目标媒体 在进行新闻软…

从物联网到万物互联:AI与6G融合,实现互联智能

物联网市场正在快速增长。它正在走进全球每一个家庭。据McKinsey预测&#xff0c;到2030年&#xff0c;全球物联网市场将达到12.6万亿美元。但是&#xff0c;如今&#xff0c;它已不再严格限于机器对机器(M2M)通信。 物联网(IoT)建立了一个网络&#xff0c;用于连接物理对象&am…

数据结构(一)—— 数据结构简介

文章目录 一、基本概念和术语&#xff1f;1.1、数据1.2、数据元素1.3、数据项&#xff08;属性、字段&#xff09;1.4、数据对象1.5、数据结构 二、逻辑结构和物理结构&#xff08;存储结构&#xff09;2.1、逻辑结构1、定义2、分类&#xff08;线性结构和非线性结构&#xff0…

机器学习 Q-Learning

对马尔可夫奖励的理解 看的这个教程 公式&#xff1a;V(s) R(s) γ * V(s’) V(s) 代表当前状态 s 的价值。 R(s) 代表从状态 s 到下一个状态 s’ 执行某个动作后所获得的即时奖励。 γ 是折扣因子&#xff0c;它表示未来奖励的重要性&#xff0c;通常取值在 0 到 1 之间。…

程序员个性终端指南(cmder、powershell、window terminal)

序言 工欲善其事&#xff0c;必先利其器。对于 IT 从业者&#xff0c;命令行终端是一道绕不过的坎&#xff0c;日常开发、服务运维都要用到这个工具。 这里我介绍下从业多年来用过的 windwos 平台下终端工具。 CMD/命令行提示符 这个是 windows 自带的工具&#xff0c;平平无…

10.12按键中断

设置按键中断&#xff0c;按键1按下&#xff0c;LED亮&#xff0c;再按一次&#xff0c;灭 按键2按下&#xff0c;蜂鸣器响。再按一次&#xff0c;不响 按键3按下&#xff0c;风扇转&#xff0c;再按一次&#xff0c;风扇停 keyit.h: #ifndef __KEYIT_H__ #define __KEYIT_…

speech recognization

目标&#xff0c;在播放声音的时候&#xff0c;禁用掉麦克风 新建立一个文件夹&#xff0c;然后拖入vscode中 然后创建虚拟环境&#xff0c;vscode会自动帮我们创建虚拟环境&#xff0c;手动激活虚拟环境 source venv/bin/activate import speech_recognition as sr import …

免费使用Salesforce Data Cloud!详细操作步骤来啦

Data Cloud是Salesforce向市场推出的增长最快的产品&#xff0c;这对Salesforce来说是一个重要竞争优势。 近期&#xff0c;Salesforce宣布客户可以免费使用Data Cloud。这就是所谓的零美元SKU&#xff0c;换句话说&#xff0c;这是一条不会产生任何成本的Salesforce产品线。 …