位置: IT常识 - 正文

React获取DOM和获取组件实例的方式(react useref获取dom元素)

编辑:rootadmin
React获取DOM和获取组件实例的方式 文章目录React获取DOM的方式ref获取DOM元素ref获取组件实例React获取DOM的方式ref获取DOM元素

推荐整理分享React获取DOM和获取组件实例的方式(react useref获取dom元素),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react获取元素,react获取ref,react useref获取dom元素,react 获取dom,react useref获取dom元素,react获取ref,react获取数据,react 获取dom,内容如对您有帮助,希望把文章链接给更多的朋友!

在React的开发模式中,通常情况下不需要、也不建议直接操作DOM原生,但是某些特殊的情况,确实需要获取到DOM进行某些操作:

管理焦点,文本选择或媒体播放;

触发强制动画;

集成第三方 DOM 库;

我们可以通过refs获取DOM;

如何创建refs来获取对应的DOM呢?目前有三种方式:

方式一:传入字符串(这种做法已经不推荐)

在React元素上绑定一个ref字符串, 使用时通过 this.refs.传入的字符串格式获取对应的元素;

import React, { PureComponent } from 'react'export class App extends PureComponent { getDom() { // 方式一 console.log(this.refs.hello) // <h2>Hello World</h2> } render() { return ( <div> <h2 ref="hello">Hello World</h2> <button onClick={() => this.getDom()}>获取DOM</button> </div> ) }}export default App

方式二:传入一个对象(常用的方式, 推荐)

React获取DOM和获取组件实例的方式(react useref获取dom元素)

在react中导入createRef, 通过createRef() 方式提前创建出来一个对象, 将创建出来的对象绑定到要获取的元素上;

使用时获取到创建的对象其中有一个current属性就是对应的元素;

import React, { PureComponent, createRef } from 'react'export class App extends PureComponent { constructor() { super() // 提前创建一个ref对象 this.titleRef = createRef() } getDom() { // 方式二 console.log(this.titleRef.current) // <h2>Hello World</h2> } render() { return ( <div> <h2 ref={this.titleRef}>Hello World</h2> <button onClick={() => this.getDom()}>获取DOM</button> </div> ) }}export default App

方式三:传入一个函数(了解)

该函数会在DOM被挂载时进行回调,这个函数回调时会传入一个元素对象,我们可以自己保存;

使用时,直接拿到之前保存的元素对象即可;

import React, { PureComponent, createRef } from 'react'export class App extends PureComponent { getDom() { } render() { return ( <div> <h2 ref="hello">Hello World</h2> <h2 ref={this.titleRef}>Hello World</h2> {/* 方式三, 回调函数会返回el, el就是我们要获取的DOM了 */} <h2 ref={el => console.log(el)}>Hello World</h2> <button onClick={() => this.getDom()}>获取DOM</button> </div> ) }}ref获取组件实例

ref 的值根据节点的类型而有所不同:

当 ref 属性用于 HTML 元素时,构造函数中使用 React.createRef() 创建的 ref 接收底层 DOM 元素作为其 current 属性;

当 ref 属性用于自定义 class 组件时,ref 对象接收组件的挂载实例作为其 current 属性;

你不能在函数组件上使用 ref 属性,因为他们没有实例;

这里我们演示一下ref获取一个class组件对象的实例:

import React, { PureComponent, createRef } from 'react'// 创建一个类组件, 作为子组件测试class Test extends PureComponent { test() { console.log("Test"); } render() { return <h2>Test</h2> }}export class App extends PureComponent { constructor() { super() this.tsetRef = createRef() } getDom() { // 获取组件实例 console.log(this.tsetRef.current) // 可以调用组件的实例方法 this.tsetRef.current.test() } render() { return ( <div> <Test ref={this.tsetRef}/> </div> ) }}export default App

函数式组件是没有实例的,所以无法通过ref获取他们的实例:

但是某些时候,我们可能想要获取函数式组件中的某个DOM元素;

这个时候我们可以通过 React.forwardRef 来绑定函数组件中的某个元素, forwardRef中接收两个参数, 参数一: props, 参数二: ref,后面我们也会学习 hooks 中如何使用ref;

import { render } from '@testing-library/react';import React, { PureComponent, createRef, forwardRef } from 'react'}// 创建一个函数组件, 作为子组件测试// 使用forwardRef将函数包裹起来const Foo = forwardRef(function(props, ref) { return ( <h2 ref={ref}>Foo</h2> )})export class App extends PureComponent { constructor() { super() // 提前创建一个ref对象 this.fooRef = createRef() } getDom() { // 获取函数组件中元素的DOM console.log(this.fooRef.current) } render() { return ( <div> <Foo ref={this.fooRef}/> </div> ) }}export default App
本文链接地址:https://www.jiuchutong.com/zhishi/299760.html 转载请保留说明!

上一篇:HTML小游戏12 —— 汽车赛道飙车游戏(附完整源码)(html5简单小游戏代码)

下一篇:实现扩展 external 能力的 Vite 插件(实现扩展功能的快捷键)

  • 固定资产清理过程涉及的报表
  • 增值税附加税怎么填
  • 增值税留抵抵欠税政策解读
  • 发票勾选比账上多
  • 应交增值税账面和申报表不符
  • 转回存货跌价准备对递延所得税资产的影响
  • 存款利息收入增值税是免税还是不征税
  • 金税盘开完票后怎么报税一下
  • 建筑施工企业的法定代表人对本企业的安全生产负责
  • 增值税进项税额不予抵扣的项目包括
  • 不动产评估需要明确的基本事项包括哪些内容
  • 退休人员是否还继续享受社保
  • 高速公路抵税
  • 销售赠品怎么入账
  • 企业会计准则基本准则的主要内容
  • 财务保证金怎么做分录
  • 补缴以前年度的印花税账务处理
  • 企业代收代缴水电费出现差额怎么解释
  • 固定资产分期抵扣怎么申报增值税?
  • 交易性金融资产的账务处理
  • 已完成认证
  • 个人独资企业办收款码
  • 实收资本未到位借款利息可以税前扣除吗
  • 委托加工业务流程图
  • 笔记本设置权限管理在哪
  • 企业之间资金拆借利息是否可以税前扣除
  • 计提工资大于实际工资
  • 公司过年买的鞭炮可以入账吗
  • Win10 21H2 Build 21354 ISO 太阳谷官方镜像预览版下载
  • 什么是应交税费科目
  • 关于工程材料的图书有哪些
  • Win10 20H2 Beta 预览版 19042.782正式推送(附更新内容)
  • 跨年销货退回账务处理
  • phpunicode
  • 企业合作建房会计核算
  • 现金收入如何做账务处理
  • 个人投资所得税率是多少
  • php全局变量和局部变量
  • css 100vw、100vh出现滚动条怎么解决
  • php 替换函数
  • 《网络安全从入门到精通》
  • 购买货物对方代付怎么办
  • 计提票面利息
  • 四舍五入产生的原理
  • 绩效奖个人所得税是多少
  • 出口退税率为0要补增值税吗
  • 增值税退税流程怎么操作
  • 纳税人的交际应酬消费可以抵扣进项税额
  • 企业股权转让收入会计处理
  • 收到政府补助怎么感谢
  • 资本公积的核算维度是什么
  • 首次购买金税盘及服务费的账务处理
  • 股权投资业务是什么意思
  • 一般纳税人的发票抵扣有效期多久
  • 房地产企业增值税计算
  • mac 电脑出现问题而重新启动
  • Solaris 远程磁带备份步骤
  • bios和cmos的区别和联系
  • 电脑蓝屏bios设置教程
  • Win7系统打开蓝牙
  • 四步清理手机垃圾的方法
  • window八
  • 有趣的linux命令
  • ComboBox 和 DateField 在IE下消失的解决方法
  • 绘制多边形工具使用方法
  • JavaScript事件处理器中的event参数使用介绍
  • 你知道的,是我的兄弟 我要把天赋
  • 查看接入安卓终端密码
  • 原生js实现promise.all
  • Android ImageLoader 本地缓存
  • pythonsetter
  • python sco
  • 江苏税务开票申报操作
  • 江苏国税电子税务局打印控件
  • 江西电子税务局官网
  • 上海税务网厅
  • 深圳纳税信息查询
  • 电池涂料消费税问题
  • 建筑行业增值税税收优惠政策
  • 税务总局2016年70号公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设