react——ref获取原生DOM元素

本文介绍了React中ref的应用,包括如何在HTML标签元素中使用ref以获取DOM元素,以及在组件上使用ref来调用子组件的方法。特别强调了函数式组件中无法直接通过ref获取组件对象,但可以通过React.forwardRef和hooks解决这一问题。

一.  ref 用于HTML标签元素中

      <h2 ref=字符串/对象/函数>h2元素<h2>

其中,字符串形式 官方已不再推荐使用

1.对象形式

import React, { Component,createRef } from 'react'

export default class App extends Component {
    constructor(){
        super();
        this.titleRef=createRef();
    }
    render() {
        return (
            <div>
                <h2 ref={this.titleRef}>App组件内容</h2>
                <button onClick={e=>this.btnApp()}>App按钮</button>
            </div>
        )
    }
    btnApp(){
        this.titleRef.current.innerHTML="改变后的文本"
    }
}

2.函数形式

import React, { Component} from 'react'

export default class App extends Component {
    constructor(){
        super();
        this.titleEL=null;
    }
    render() {
        return (
            <div>
                <h2 ref={(arg)=>this.titleEL=arg}>App组件内容</h2>
                <button onClick={e=>this.btnApp()}>App按钮</button>
            </div>
        )
    }
    btnApp(){
        this.titleEL.innerHTML="11111111"
    }
}

二. ref 用于组件上

可以实现:点击父组件中的按钮,调用子组件中的方法

父组件:

import React, { Component, createRef} from 'react'
import Counter from './Counter'

export default class App extends Component {
    constructor(){
        super();
        this.counterRef=createRef()
    }
    render() {
        return (
            <div>
                <Counter ref={this.counterRef}/>
                <button onClick={e=>this.CounterClick()}>App按钮</button>
            </div>
        )
    }
    CounterClick(){
        this.counterRef.current.CounterClick()
    }
}

子组件:

import React, { PureComponent } from 'react'

export default class Counter extends PureComponent {
    constructor(){
        super();
        this.state={
            num:0
        }
    }
    render() {
        return (
            <div>
                num:{this.state.num}
                <button onClick={e=>this.CounterClick()}>Counter+1</button>
            </div>
        )
    }
    CounterClick(){
        this.setState({
            num:this.state.num+1
        })
    }
}

注意:当ref用于组件时,current才表示组件对象

若子组件是函数式组件,则无法获取对应的组件对象,因为函数式组件没有实例。函数式组件中不能使用ref获取。要想获取函数式组件的DOM元素,要用React.forwardRef(高阶组件)以及hooks

React 中实时监听 DOM 元素尺寸变化,有以下几种常见的解决方案: ### 使用 ResizeObserver API `ResizeObserver` 是浏览器提供的一个原生 API,用于监听元素尺寸的变化。在 React 中可以结合 `useRef` 和 `useEffect` 来使用它。 ```jsx import React, { useRef, useEffect } from 'react'; const ResizeComponent = () => { const ref = useRef(null); useEffect(() => { const element = ref.current; if (element) { const resizeObserver = new ResizeObserver((entries) => { for (const entry of entries) { const { width, height } = entry.contentRect; console.log(`Element width: ${width}, height: ${height}`); } }); resizeObserver.observe(element); return () => { resizeObserver.disconnect(); }; } }, []); return ( <div ref={ref} style={{ width: '200px', height: '200px', background: 'lightblue' }}> Resizable Element </div> ); }; export default ResizeComponent; ``` 在上述代码中,首先使用 `useRef` 创建一个引用,然后在 `useEffect` 中,当组件挂载时,创建一个 `ResizeObserver` 实例,并使用 `observe` 方法监听元素尺寸的变化。当组件卸载时,使用 `disconnect` 方法停止监听。 ### 使用第三方库 `react-resize-detector` `react-resize-detector` 是一个专门用于在 React 中监听元素尺寸变化的库,使用起来非常方便。 安装库: ```bash npm install react-resize-detector ``` 使用示例: ```jsx import React from 'react'; import { ResizeDetector } from 'react-resize-detector'; const ResizeComponent = () => { const onResize = (width, height) => { console.log(`Element width: ${width}, height: ${height}`); }; return ( <div style={{ width: '200px', height: '200px', background: 'lightgreen' }}> <ResizeDetector handleWidth handleHeight onResize={onResize}> <div>Resizable Element</div> </ResizeDetector> </div> ); }; export default ResizeComponent; ``` 在上述代码中,使用 `ResizeDetector` 组件包裹需要监听尺寸变化的元素,并通过 `onResize` 回调函数获取元素的宽度和高度。 ### 使用 `window.resize` 事件(不推荐用于单个元素) 虽然可以监听 `window` 的 `resize` 事件来间接感知元素尺寸的变化,但这种方法只能感知窗口大小变化,不能精确感知单个元素的尺寸变化,并且性能较低。 ```jsx import React, { useEffect } from 'react'; const ResizeComponent = () => { useEffect(() => { const handleResize = () => { const element = document.getElementById('my-element'); if (element) { const { width, height } = element.getBoundingClientRect(); console.log(`Element width: ${width}, height: ${height}`); } }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); }; }, []); return ( <div id="my-element" style={{ width: '200px', height: '200px', background: 'lightyellow' }}> Resizable Element </div> ); }; export default ResizeComponent; ``` 在上述代码中,监听 `window` 的 `resize` 事件,当窗口大小变化时,获取指定元素的尺寸信息。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值