一,什么是ref
?
1.ref
是react
提供的一种可以直接获取元素 dom
对象或者组件实例的方法。
二,ref
设置
1.通过在组件或者dom
元素上设置ref
属性来获取相应组件实例或者dom
对象
2.ref
属性的值有两种:回调ref
和使用 React.createRef()
创建
<Component ref={
ref=>{
this.ref=ref}/>
class Component extends react.Component{
constructor(props){
super(props)
this.ref = React.createRef()
render(){
return <C ref={
this.ref}}/>
}}
三,ref
使用
1.如果使用回调ref
:直接使用this.ref
可直接访问到组件实例
2.如果使用React.createRef()
:用this.ref.current
访问到组件实例
3.对于一个组件实例(对象),我们可以获取组件的this
对象和定义在组件上的方法。
四,设置ref
的限制
1.可以在html
元素设ref
,这时可访问到元素的dom
对象(等价于使用document.getElementByXXX()
),可以使用所有原生dom
对象方法
2.可以在class
组件上设置ref
,可访问到组件实例
3.不可以在函数组件上设置ref
,因为函数组件没有实例
4.对于高阶组件HOC
,ref
不会指向被包裹的组件,而是会指向高阶组价。解决方法使用ref
转发。
五,ref
转发:React.forwardRef()
1.在组价上使用ref
属性是会获取整个组件实例,
2.例如HOC
高阶组件上使用ref
获得的是高阶组件实例,获取不到被包裹组件实例。(被redux
的connect
的组件,直接使用ref
,获取不到被包裹的组件实例)。
3.ref
转发能让组件的ref
返回组件内部特定的子组件或元素实例。
4.React
提供了React.forwardRef
实现ref
转发。
5.React.forwardRef(fn)
:接受一个函数fn
作为参数,fn的返回值是一个组件,且React.forwardRef(fn)
返回值就是该组件。
函数的参数为(props,ref)
:props
代表组件接收的props
,
函数返回一个组件<C forward={ref} {...props}/>
:这里我们把ref
作为普通的props
命名为forward
(可以随意命名)传递给组件。
6.在组件内部我们将forward
转给需要转发子组件或者元素的ref
属性上。
function C(props){
return <div><button ref={props.forward}></button></div>
}
7、这样在父组件上使用ref
则会获取指定元素的ref
。