React-Ref

1. React中获取元素的方式

原生DOM(不推荐)

通过ref获取(推荐)

字符串

对象

回调函数
原生DOM获取元素(不推荐)

非常非常不推荐,因为这种情况是通过拿到真实DOM,而react创建元素大多数时候是通过虚拟DOM创建的

复制代码
import React from 'react';
class App extends React.PureComponent{
   
    constructor(props){
   
        super(props);
    }
    render(){
   
        console.log('App-render被调用');
        return (
            <div>
                <p id={
   'box'}>我是段落</p>
                <button onClick={
   ()=>{
   this.btnClick()}}>APP按钮</button>
            </div>
        )
    }
    btnClick(){
   
        // 第一种获取方式: 传统方式(在React中及其不推荐)
        let oP = document.getElementById('box');
        oP.innerHTML = 'www.it666.com';
        console.log(oP);
    }
}
export default App;

第二种方式:通过refs结合字符串进行获取(react即将废弃)

通过ref='字符串' / this.refs.字符串 (通过字符串的方式即将被废弃, 也不推荐)

复制代码
import React from 'react';
class App extends React.PureComponent{
   
    constructor(props){
   
        super(props);
    }
    render(){
   
        console.log('App-render被调用');
        return (
            <div>
                // 1. 给获取的元素添加refs
                <p ref={
   'box'}>我是段落</p>
                <button onClick={
   ()=>{
   this.btnClick()}}>APP按钮</button>
            </div>
        )
    }
    btnClick(){
   
        // 第二种获取方式: 通过ref='字符串' / this.refs.字符串 (通过字符串的方式即将被废弃, 也不推荐)
        let oP = this.refs.box;
        oP.innerHTML = 'www.it666.com';
        console.log(oP);
    }
}
export default App;

第三种获取方式:通过refs+对象获取

通过createRef()创建一个对象, 然后将这个对象传递给ref (推荐)

复制代码
import React from 'react';
class App extends React.PureComponent{
   
    constructor(props){
   
        super(props);
// 1.先创建一个Ref对象
        this.oPRef = React.createRef();
        this.oPRef = null;
    }
    render(){
   
        console.log('App-render被调用');
        return (
            <div>
                <p ref={
   this.oPRef}>我是段落</p>
                <button onClick={
   ()=>{
   this.btnClick()}}>APP按钮</button>
            </div>
        )
    }
    btnClick(){
   
       // 2. 第三种获取方式: 通过createRef()创建一个对象, 然后将这个对象传递给ref (推荐)
        let oP = this.oPRef.current;
        oP.innerHTML = 'www.it666.com';
        console.log(oP);
    }
}
export default App;

第四种方式:通过函数返回组件内容

第四种获取方式: 通过传递一个回调函数, 然后保存回调函数参数的方式(推荐)

复制代码
import React from 'react';
class App extends React.PureComponent{
   
    constructor(props){
   
        super(props);
        // 定义一个变量对象为空
        this.oPRef = null;
    }
    render(){
   
        console.log('App-render被调用');
        return (
            <div>
              //参数就是该元素,将arg赋值给OPRef
                <p ref={
   (arg)=>{
   this.oPRef = arg}}>我是段落</p>
                <button onClick={
   ()=>{
   this.btnClick()}}>APP按钮</button>
            </div>
        )
    }
    btnClick(){
   
        // 第四种获取方式: 通过传递一个回调函数, 然后保存回调函数参数的方式(推荐)
        let oP = this.oPRef;
        oP.innerHTML = 'www.it666.com';
        console.log(oP);
    }
}
export default App;

根据浏览器的报错提示Do you mean to use React.forwardRef()?

其实在react中虽然拿不到函数式组件的ref,但是能够通过React.forwardRef()拿到组件内部的内容,如下

复制代码
// props接收父组件的数据;myRef接收外部传进来的ref
const About = React.forwardRef(function(props, myRef) {
    // myRef === this.myRef
    return (
        <div>
            <p>我是段落</p>
            <span ref={
   myRef}>我是span</span>
        </div>
    )
});
class App extends React.PureComponent{
   
    constructor(props){
   
        super(props);
        this.myRef = React.createRef();
    }
    render(){
   
        return (
            <div>
// 在自定义组件外部赋予属性ref={this.myRef}
                <About ref={
   this.myRef}/>
                <button onClick={
   ()=>{
   this.btnClick()}}>APP按钮</button>
            </div>
        )
    }
    btnClick(){
   
        console.log(this.myRef.current);
//   <span>我是span</span>
    }
}
export default App;

这种现象叫做Ref转发

相关推荐
এ慕ོ冬℘゜4 分钟前
手写生产级 jQuery Toast 轻量提示组件|零插件依赖、动画流畅、极简高
前端·javascript·jquery
Oneslide26 分钟前
UI设计-企业OA风格
前端
程序员海军37 分钟前
我用了 8 个月 Codex CLI,总结出这套 AI 编程工作流
前端·后端·aigc
大家的林语冰44 分钟前
Express 团队官宣:全新网站正式上线,Logo 重做,支持两个主版本文档无缝切换!
javascript·node.js·express
এ慕ོ冬℘゜1 小时前
手写一款高兼容、零BUG图片预览组件|前端
前端·bug
铁链鞭策大师1 小时前
javaEE之多线程(2)
java·前端·java-ee
KaMeidebaby1 小时前
卡梅德生物技术快报|生信实操:ChIP 染色质免疫共沉淀技术流程、短板与替代方案详解
前端·人工智能·物联网·百度·新浪微博
weixin199701080161 小时前
[特殊字符] 【性能提升300%】仿1688首页的Webpack优化全记录(附构建分析Python脚本)
前端·python·webpack
海兰1 小时前
【文字三国志:第五篇】天命重构,游戏前端UI设计
前端·人工智能·游戏·语言模型
时寒的笔记1 小时前
LF11期_day19~20 补环境(二)入门案例
javascript