React组件通讯-REF属性

REF常见使用场景:抓取子元素实现控制焦点或交给Dom操作库动画库进行Dom操作。

注意:REF操作真实的DOM元素和结构,必须在组件挂载完毕之后操作,否则会出现获取为空对象的情况。

常见的使用方法

1. React.createRef()

一个 ref 实例在构造函数中创建,并赋值给 this.firstRef
this.firstRef = React.createRef() ->等同于{current:null}
在 render() 方法内部,将构造函数中创建的 ref 传递给 div
<div ref={this.firstRef} />
处理Dom元素
this.firstRef.current ->Dom元素.

2. 回调引用 (Callback refs)

<jsx ref={el => this.实例属性 = el} 返回的是Dom元素的本身.
当组件安装时,将 DOM el元素传递给 ref 的回调
当组件卸载时,则会传递 null.
ref 回调会在 componentDidMount 和 componentDidUpdate 生命周期之前调用.
this.实例属性 后期用作访问jsx元素

3. String refs

<jsx ref="r1">
组件: this.refs.r1


4. 转发 refs (Forwarding refs)

将 ref 通过组件传递给其子节点的技术。它对于可复用组件库和高阶组件(HOC)等情况非常有用
this.inputRef = React.createRef()
<子组件 ref={this.inputRef} />
子组件:
const 子组件 = React.forwardRef((props, ref) => (
  <input type="text" ref={ref}/>)
);

 

示例代码

 

import React from "react";

export default class App extends React.Component{
    state={
        pareText:"-"
    }

    constructor(){
        super();
        this.r1 = React.createRef();
        this.r4 = React.createRef();

        // console.log(11111,this.r1); //此时拿不到this.r1  ref操作的是真实Dom元素,需要在组件挂载完毕时使用.
    }

    render(){
        return(
            <div>
                <h2 ref = {this.r1}>我是根组件1</h2>
                <h2 ref={el=>this.r2=el}>我是根组件2</h2>
                <h2 ref="r3">我是根组件3</h2>
                <hr />
                <Child1 ref = {this.r4}/>
                <Child1 ref={el => this.r5 = el}/>
                <Child1 ref="r6" />
                <hr />
                {this.state.pareText}
                <hr />
                <Child2 ref={el =>this.soho = el}/>
            </div>
        )
    }

    componentDidMount(){
        console.log('this.r1',this.r1);
        this.r1.current.style.backgroundColor = "red";

        console.log('this.r2',this.r2);
        this.r2.style.backgroundColor = "blue";

        console.log('this.r3',this.refs.r3);
        this.refs.r3.style.backgroundColor = "black";


        console.log('this.r4',this.r4);

        console.log('this.r5',this.r5);

        console.log('this.r6',this.refs);


        console.log('this',this);
        this.setState({
            pareText:this.r5.state.childText
        })


        console.log('this.soho',this.soho)
        this.soho.style.backgroundColor = "yellow";


    }


}

class Child1 extends React.Component{
    state={
        childText:"子组件SOHO数据"
    }
    render(){
        return(
            <div>
                <hr />
                <h2>Child1组件</h2>
            </div>
        )
    }
}

let Child2 = React.forwardRef((props,ref)=>(
        <div>
            <h2>Child2组件的H2</h2>
            <div ref={ref}>Child2组件的DIV</div>
        </div>
    )
);
  
       

 

  

 

代码结果

 

 

资料参考

 

https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651556458&idx=1&sn=777fa954624174f179bc5b1effa05ec7&chksm=80255dabb752d4bd250fe267f5c8000020588c29eb1d48195fdb17d9ef214c2ee7344ed751df&mpshare=1&scene=1&srcid=0530RdLJjRNwqhUV20CaQKE4&pass_ticket=R3Tg7aoTqhlXapPxG3nxKPkPWBqps0NbGQpmuF5eonS2JJn%2BA5GbdX2JcadySYoS#rd

 

 

posted @ 2019-11-23 18:09  Scok  阅读(432)  评论(0编辑  收藏  举报