React三大属性之refs

前言

javascript 复制代码
<div id="test"></div>
<script type="text/babel">
    class Demo extends React.Component{
        showData = ()=>{
            const inputValue = document.getElementById("input")
            alert(inputValue)
        }
        render(){
            return (
                <input type="text" id="input" />
                <button onClick="{ this.showData }"></button>
            )
        }
    }

    ReactDOM.render(<Demo />,document.getElementById("test"))
</script>

以上,我们给按钮绑定了一个事件,通过原生的选择器获取了输入框的这个DOM,输出了输入框里的内容。

组件内的标签可以定义ref属性来标识自己

1、字符串式ref

javascript 复制代码
<div id="test"></div>
<script type="text/babel">
    class Demo extends React.Component{

        showData = ()=>{
            alert(this.refs.input1.value)
        }
        showData2 = ()=>{
            alert(this.refs.input2.value)
        } 

        render(){
            return (
                <input type="text" ref="input1"/>
                <button onClick="{ this.showData }"></button>
                <input type="text" ref="input2" onBlur="{ this.showData2 }" />
            )
        }
    }

    ReactDOM.render(<Demo />,document.getElementById("test"))
</script>

这里的在标签中添加ref类似于vue2的ref的使用

字符串类型的refs存在效率低的问题,未来版本可能会移除

2、回调函数类型的ref

javascript 复制代码
<div id="test"></div>
<script type="text/babel">
    class Demo extends React.Component{
        showData = ()=>{
            const input1 = this
            alert(input1.value)
        }
        render(){
            return (
                <input type="text" ref={ c=>this.input1 = c } />
                <button onClick="{ this.showData }"></button>
            )
        }
    }

    ReactDOM.render(<Demo />,document.getElementById("test"))
</script>

解释

ref={ c=>this.input1 = c } 这个代码实际是 ref={ (c)=>{ this.input1 = c } },而这个C打印的话,可以发现它所代表的是input这个DOM。

3、回调ref的执行次数

javascript 复制代码
 <input type="text" ref={ c=>this.input1 = c } />

官网中说:如果ref回调函数是以内联函数的方式定义的,在更新过程中,它会被执行两次,第一次传入参数 null ,然后第二次传入参数DOM元素,这是因为在每次渲染时会创建一个新的函数梳理,所以React清空旧的ref并且设置新的。通过将ref的回调函数定义成class的绑定函数的方式就可以避免上述问题,但是大多数情况下它是无关紧要的。

我们之前说过render这个函数的执行次数是1+n次,当运行时,该标签发生的更新,那这个ref的执行就会次数就会+2。

ref的回调函数定义成class的绑定函数的方式

javascript 复制代码
<div id="test"></div>
<script type="text/babel">
    class Demo extends React.Component{
        showData = ()=>{
            const { input1 } = this
            alert(input1.value)
        }

        showInput=(c)=>{
            this.input1 = c
            //这个c就是input这个DOM
        }
        render(){
            return (
                //在JSX语法中,如果想注释一些html代码,可以使用 { /*     */ }的形式注释
                //因为在JSX中,{}里可以写js代码
                {/*<input type="text" ref={ c=>this.input1 } />*/}


                <input type="text" ref={ this.showInput } />
                <button onClick="{ this.showData }"></button>
            )
        }
    }

    ReactDOM.render(<Demo />,document.getElementById("test"))
</script>

4、createRef的使用

React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该节点是专人专用,也就是只能存储一个DOM

javascript 复制代码
<div id="test"></div>
<script type="text/babel">
    class Demo extends React.Component{
        
        myRef = React.createRef()

        showData = ()=>{
            alert(this.myRef.current.value)
        } 

        render(){
            return (
                <input type="text" ref="{ this.myRef }"/>
                <button onClick="{ this.showData }"></button>
            )
        }
    }

    ReactDOM.render(<Demo />,document.getElementById("test"))
</script>
相关推荐
Autumn_ing7 小时前
Design.md生成UI怎么验收?举例运营后台的颜色、状态和数据核对
前端·ui·ai·设计系统·paico·ai生成ui·design.md
远离UE48 小时前
UE5 Substrate Thin Film 源码拆析
开发语言·javascript·ue5
keyipatience8 小时前
JavaScript学习(1)书写位置,变量、数据类型、运算符
开发语言·前端·javascript·css·学习
朱涛的自习室8 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
java1234_小锋11 小时前
【技术专题】HTML5 网页技术 - HTML5简介 & HTML5 文档结构
前端·html·html5
鶴哥只手遮天11 小时前
Vue 3 核心源码深度剖析系列(v3.5.44)-第 1 章 项目全景:monorepo 架构与工程化体系
前端·vue.js·开源
流星。。方11 小时前
小团队官网SEO落地:前端语义化与静态生成的工程实践
前端·状态模式
小天源11 小时前
智叟云集系统架构解析:从品牌 AI 可见度监测到前后端协同
人工智能·react.js·系统架构·node.js·react·ai监测·ai品牌监测
用户5304297657911 小时前
盘点危化品搬运诊断的6类工具与自处理边界判断
前端
curtain11 小时前
从古法编程到 Agent:我入行这两年,AI 改变了什么
前端·openai