react中ref使用方法解析

简介: 组件不是真实的DOM节点,在react开发中,官方也不建议直接去操作原生的DOM。组件的DOM节点是存在于内存中的一种数据结构,叫做虚拟DOM。如果需要从组件中获取真实的DOM节点,那就需要官方提供ref的属性。==React提供了ref用于访问在render方法中创建的DOM元素或者是React的组件实例

什么是ref

组件不是真实的DOM节点,在react开发中,官方也不建议直接去操作原生的DOM。组件的DOM节点是存在于内存中的一种数据结构,叫做虚拟DOM。如果需要从组件中获取真实的DOM节点,那就需要官方提供ref的属性。==React提供了ref用于访问在render方法中创建的DOM元素或者是React的组件实例。==
ref分为三种,我们这里先学两种。

string类型

看下面的小例子:点击按钮能够把输入框的值赋值给下面的p标签

import React, { Component } from 'react'

export class App extends Component {
    render() {
        return (
            <div>
                <input type='text' ref="haha" />
                <button onClick={this.getText}>点击</button>
                <p ref="user">user</p>
            </div>
        )
    }
    getText = () => {
        console.log(this.refs.haha.value)
        const user = this.refs.haha.value
        this.refs.user.innerHTML = user
    }
}

export default App
AI 代码解读

这里我们就是通过ref来获取dom结点进行操作,input输入数据之后打印this.refs:
可以看到输入框的数据即为this.refs.haha.value
在这里插入图片描述
不过这种string类型的方法以及淘汰掉了,来看下一种

createRef创建

首先在页面最上面要进行导入,这里也导入一下PureComponent,因为下面例子会用到

import React, { createRef, PureComponent } from 'react'
AI 代码解读

写法一:

1.直接在constructor中定义this.headerRefs = createRef()
2.然后在需要使用的组件上绑定ref:
3.在按钮的点击时间中 通过current属性去获取DOM节点或者组件是实例,这里打印出来了

export class App extends PureComponent {
    constructor() {
        super()
        this.headerRefs = createRef()
    }
    render() {
        return (
            <div>App Page
                <Header ref={this.headerRefs}/>
                <button onClick={this.getText}>点击获取</button>
            </div>
        )
    }
    getText = () => {
        // 通过current属性去获取DOM节点或者组件是实例
        console.log(this.headerRefs.current.state.name)
  
    }
}

class Header extends PureComponent {
    state = {name: 'hello react'}
    render() {
        return (<div>header Component</div>)
    }
}

export default App
AI 代码解读

功能是实现了,但是在constructor中进行实现多少有点麻烦,下面介绍另一个写法:

写法二:

将input的内容展示给p标签
1.直接使用headerRefs = createRef()的格式去创建ref
2.在需要使用的组件上进行绑定< Header ref={this.headerRefs}/>
3.使用this.userRefs.current.innerHTML = this.inputRefs.current.value完成需求

export class App extends PureComponent {

    headerRefs = createRef()
    inputRefs = createRef()
    userRefs = createRef()
    render() {
        return (
            <div>App Page
                <Header ref={this.headerRefs}/>
                <input type='text' ref={this.inputRefs} />
                <p ref={this.userRefs}>user</p>
                <button onClick={this.getText}>点击获取</button>
            </div>
        )
    }
    getText = () => {
        console.log(this.headerRefs.current.state.name)
        console.log(this.inputRefs)
        console.log(this.userRefs)
        this.userRefs.current.innerHTML = this.inputRefs.current.value
    }
}

class Header extends PureComponent {
    state = {name: 'hello react'}
    render() {
        return (<div>header Component</div>)
    }
}

export default App
AI 代码解读

查看效果:
在这里插入图片描述

目录
打赏
0
0
0
0
450
分享
相关文章
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
188 17
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
187 4
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
159 12
React音频播放控制组件开发深度解析
本文介绍了构建React音频控制组件时遇到的关键问题及优化方案。主要包括: 1. **状态同步难题**:解决播放按钮与音频状态不同步的问题,通过双向绑定机制确保一致。 2. **跨浏览器兼容性**:处理Safari和Chrome预加载策略差异,确保`duration`属性正确获取。 3. **进度控制优化**:避免使用`setInterval`,采用`requestAnimationFrame`提升性能;优化拖拽交互,防止音频卡顿。 4. **音量控制进阶**:实现渐变音量调节和静音状态同步。
133 15
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
263 8
React Hooks 深入解析
React Hooks 深入解析
104 0
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
npx与npm的差异解析,以及包管理器yarn与Node版本管理工具nvm的使用方法详解
581 0
【第34期】一文学会React组件传值
【第34期】一文学会React组件传值
147 0

推荐镜像

更多
  • DNS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问