【 React 】三种 ref 的方式以及高阶组件必备 ref 转发

在React中没有直接的API去操作DOM 结构,所以就要用到 ref 来获取DOM结构,常用的方法有以下三种

1、字符串类型的ref

顾名思义 ref接收的是一个字符串,如果你目前还在使用 this.refs.textInput 这种方式访问 refs ,建议用回调函数或 createRef API 的方式代替。因为会有BUG

<div id="app"></div>
<script type="text/babel">
    //通过ref=""这种方式来去给dom元素进行标记
    //如果你目前还在使用 this.refs.textInput 这种方式访问 refs ,我们建议用回调函数或 createRef API 的方式代替。
    //https://react.docschina.org/docs/refs-and-the-dom.html
    class App extends React.Component{

        componentDidMount(){  //相当于Vue中的mounted钩子函数
            console.log("componentDidMount...",this)
            this.refs.textInput.focus()
        }
        render(){
            console.log("render...")
            return (
                <div>
                    <input ref="textInput"/>    
                </div>
            )
        }
    }
    ReactDOM.render(<App/>,document.getElementById("app"))
</script>

2、函数式ref

顾名思义,ref接收的是一个函数,函数的参数为设置ref属性的DOM结构

<div id="app"></div>
<script type="text/babel">
    class App extends React.Component{
        componentDidMount(){  //相当于Vue中的mounted钩子函数
            this.textInput.focus()
        }
        render(){
            return (
                <div>   {/*直接用回调函数的方式进行挂载*/}
                    <input ref={ (el)=>{ this.textInput = el} }  />    //讲DOM结构挂载到this的属性上,方便调用
                </div>
            )
        }
    }
    ReactDOM.render(<App/>,document.getElementById("app"))
</script>

3、利用react中封装的方法 createRef()

此方法挂载的DOM结构在 current 属性中,如果是标签就是标签DOM,如果是组件就是组件对象。

<div id="app"></div>
<script type="text/babel">
    class App extends React.Component{
        constructor() { 
            super() //继承的时候,子类的constructor里面第一行代码必须写super关键字,目的调用父类的空构造
            //函数来去实例化子类本身。
            this.myRef = React.createRef()  //1.创建了一个ref的引用,并且可以通过this.myRef属性去进行访问
        }
        componentDidMount(){  //相当于Vue中的mounted钩子函数
            //3.注意:使用current属性才可以获取到标记的元素本身
            this.myRef.current.focus()
        }
        render(){
            return (
                <div>
                    {/*2.需要在组件或者dom元素上面通过ref进行标记*/}
                    <input  ref={this.myRef}/>    
                </div>
            )
        }
    }
    ReactDOM.render(<App/>,document.getElementById("app"))
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值