一、理解
Refs
提供了一种方式,允许我们访问 DOM
节点或在 render
方法中创建的 React 元素。
Ref
转发是一项将 ref
自动通过组件传递到子组件的技巧。 通常用来获取 DOM
节点或者 React 元素实例的工具。在 React 中 Refs
提供了一种方式,允许用户访问 DOM
节点或者在 render
方法中创建的 React 元素。
二、使用
1、回调函数形式的ref
☆这种方式是最常用的,如果 ref
回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null
,然后第二次会传入参数 DOM
元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref
并且设置新的。通过将 ref
的回调函数定义成 class
的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。
//创建组件
class Demo extends React.Component{
//展示左侧输入框的数据
showData = ()=>{
const {input1} = this
alert(input1.value)
}
//展示右侧输入框的数据
showData2 = ()=>{
const {input2} = this
alert(input2.value)
}
render(){
return(
<div>
<input ref={c => this.input1 = c } type="text" placeholder="点击按钮提示数据"/>
<button onClick={this.showData}>点我提示左侧的数据</button>
<input onBlur={this.showData2} ref={c => this.input2 = c } type="text" placeholder="失去焦点提示数据"/>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))
上述代码中的 input
域包含了一个 ref
属性,该属性声明的回调函数会接收 input
对应的 DOM
元素,我们将其绑定到 this
指针以便在其他的类函数中使用。
2、createRef 的使用
React.createRef
调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的,所以使用起来较为复杂,虽然这是最新的
//创建组件
class Demo extends React.Component{
/*
React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的
*/
myRef = React.createRef()
myRef2 = React.createRef()
//展示左侧输入框的数据
showData = ()=>{
alert(this.myRef.current.value);
}
//展示右侧输入框的数据
showData2 = ()=>{
alert(this.myRef2.current.value);
}
render(){
return(
<div>
<input ref={this.myRef} type="text" placeholder="点击按钮提示数据"/>
<button onClick={this.showData}>点我提示左侧的数据</button>
<input onBlur={this.showData2} ref={this.myRef2} type="text" placeholder="失去焦点提示数据"/>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))
3、字符串形式的ref
一般情况不推荐这种使用方法,虽然这种方式很简单, string
类型的 refs
存在 一些问题。它已过时并可能会在未来的版本被移除。
//创建组件
class Demo extends React.Component{
//展示左侧输入框的数据
showData = ()=>{
const {input1} = this.refs
alert(input1.value)
}
//展示右侧输入框的数据
showData2 = ()=>{
const {input2} = this.refs
alert(input2.value)
}
render(){
return(
<div>
<input ref="input1" type="text" placeholder="点击按钮提示数据"/>
<button onClick={this.showData}>点我提示左侧的数据</button>
<input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"/>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))