功能
Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。
使用场景
- 管理焦点、文本选择或者媒体播放
- 触发强制动画
- 集成第三方dom库
访问ref
ref的值根据节点类型而有所不同
- 当用于html元素时,接收的是dom元素作为其current值
- 当用于类组件时,接收组件的挂载实hu例作为其current属性
- 在函数组件上使用ref属性,需要 forwardRef 与 useImperativeHandle 结合使用
调用的时机
react会在组件挂载时给current属性传入Dom元素,并在组件卸载时传入null值,ref会在componentDidMount和componentDidUpdate生命周期钩子触发前更新
基本的用法
- 回调用法
<input type="text" ref={(ref)=>{this.inputRef = ref}}>
- createRef方式
inputRef = createRef()
<input type="text" ref={this.inputRef}}>
结合组件使用,绑定在组件上
- 父组件-类组件
class App extends Component{
constructor(){
state:{
inputRef = React.createRef()
}
buttonClick(){
this.inputRef.current.focus()
}
render(){
return(
<div>
<Foo ref = {this.inputRef}>
<button onClick={this.buttonClick}>
</div>
)
}
}
const Foo =forwardRef((props,ref)=> {
const inputRef =useRef()
useImperativeHandle(ref,()=>{
return {
focus:function(){
inputRef.current.focus()
}
}
})
render(){
return <input type="text" ref={inputRef}}>
}
})
- 父组件-函数式组件
const App = () => {
const buttonRef = useRef(null)
const buttonClick(){
buttonRef.current.focus()
}
render(){
return(
<div>
<Foo ref = {buttonRef}>
<button onClick={buttonClick}>
</div>
)
}
}
const Foo =forwardRef((props,ref)=> {
const inputRef =useRef()
useImperativeHandle(ref,()=>{
return {
focus: function(){
inputRef.current.focus()
}
}
})
render(){
return <input type="text" ref={inputRef}}>
}
})