React如何获取DOM并获取组件实例
React获取DOMref的方式获取DOM元素ref获取组件实例
在React的开发模式中,通常不需要也不建议这样做直接操作DOM。原生,但在某些特殊情况下,确实需要获取DOM来执行某些操作:
管理焦点、文本选择或媒体播放;
触发强制动画;
集成第三方DOM库;
我们可以通过refs获取DOM;
如何创建refs来获取对应的DOM?目前有三种方式:
方法一:传入字符串
给React元素绑定一个ref字符串,使用时通过this.refs中传入的字符串格式获取对应的元素。
importReact,{PureComponent}from'react'exportclassAppextendsPureComponent{getDom(){//方法1console.log(this.refs.hello)//h2HelloWorld/h2}render(){return(divh2ref='hello'HelloWorld/h2按钮onClick={()=this.getDom()}获取DOM/按钮/div)}}导出默认App
方法二:传入对象
在react中导入createRef,通过createRef()提前创建一个对象,并将创建的对象与要获取的元素绑定;
使用时,获取创建对象的当前属性之一,即对应的元素;
importReact,{PureComponent,createRef}from'react'exportclassAppextendsPureComponent{constructor(){super()//提前创建一个ref对象this.titleRef=createRef()}getDom(){//方法二console。log(this.titleRef.current)//h2HelloWorld/h2}render(){return(divh2ref={this.titleRef}HelloWorld/h2按钮onClick={()=this.getDom()}获取DOM/按钮/div)}}导出默认应用程序
方法三:传入一个函数
该函数会在DOM挂载时回调。回调该函数时,会传入一个element对象,我们可以自己保存;
使用时直接获取之前保存的元素对象即可;
importReact,{PureComponent,createRef}from'react'exportclassAppextendsPureComponent{getDom(){}render(){return(divh2ref='hello'HelloWorld/h2h2ref={this.titleRef}HelloWorld/h2{/*方法三,回调函数会返回el,el就是我们要获取的DOM*/}h2ref={el=console.log(el)}HelloWorld/h2buttononClick={()=this.getDom()}获取DOM/button/div)}}
ref的值根据节点类型不同而不同:
当在HTML元素上使用ref属性时,在构造函数中使用React.createRef()创建的ref接收底层DOM元素作为其当前属性;
当ref属性用于自定义类组件时,ref对象接收组件的已安装实例作为其当前属性;
您不能在函数组件上使用ref属性,因为它们没有实例;
这里我们演示ref如何获取类组件对象的实例:
importReact,{PureComponent,createRef}from'react'//创建一个类组件并将其作为子组件进行测试classTestextendsPureComponent{test(){console.log('Test');}render(){returnh2Test/h2}}exportclassAppextendsPureComponent{constructor(){super()this.tsetRef=createRef()}getDom(){//获取组件实例console.log(this.tsetRef.current)//可以调用组件的实例方法this.tsetRef.current.test()}render(){return(divTestref={this.tsetRef}//div)}}exportdefaultApp
功能组件没有实例,因此无法通过ref:获取其实例
但有时,我们可能想获取功能组件中的某个DOM元素;
这时,我们可以通过React.forwardRef来绑定函数组件中的一个元素。forwardRef接收两个参数,参数一为:props,参数二为:ref。稍后我们还将学习如何在hooks中使用ref;
import{render}from'@testing-library/react';importReact,{PureComponent,createRef,forwardRef}from'react'}//创建函数组件并将其作为子组件进行测试//使用forwardRef包装函数constFoo=forwardRef(function(props,ref){return(h2ref={ref}Foo/h2)})exportclassAppextendsPureComponent{constructor(){super()//提前创建一个ref对象this.fooRef=createRef()}getDom(){//获取函数组件中元素的DOMconsole.log(this.fooRef.current)}render(){return(divFooref={this.fooRef}//div)}}导出默认应用程序
大家好,今天小编关注到一个比较有意思的话题,就是关于教育培训机构双ip流量的问题,于是小编就整理了5个相关介绍教育培训机构双ip流量的解答,让我们一起看看吧。淘…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构名单获取方式的问题,于是小编就整理了1个相关介绍培训机构名单获取方式的解答,让我们一起看看吧。开培训…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构电话怎么获取的问题,于是小编就整理了2个相关介绍培训机构电话怎么获取的解答,让我们一起看看吧。为什么…
大家好,今天小编关注到一个比较有意思的话题,就是关于哪个机构培训cisp好的问题,于是小编就整理了1个相关介绍哪个机构培训cisp好的解答,让我们一起看看吧。c…
大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构获取流量方式的问题,于是小编就整理了2个相关介绍培训机构获取流量方式的解答,让我们一起看看吧。财务部…
2024-10-23 15:00:05
2024-10-23 10:48:05
2024-10-23 08:48:12
2024-10-23 06:36:10
2024-10-23 04:48:07
大家好,今天小编关注到一个比较有意思的话题,就是关于新手学电脑选啥电脑好的问题,…
大家好,今天小编关注到一个比较有意思的话题,就是关于夜校培训学校地址电话的问题,…