老莫的笔记本  
  
查看: 330|回复: 0

论 react 18中的ref 如何取得渲染后的实际元素、类、方法

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2022-5-5 15:38:10 | 显示全部楼层 |阅读模式


  1. import React from "react";


  2. const TF = React.forwardRef(function(props,myTfRef){
  3.     return (
  4.         <section>

  5.             <p ref={myTfRef} >  6666 </p>
  6.             这是测试用函数组件
  7.         </section>
  8.     )
  9. })


  10. class NewRef extends React.PureComponent{
  11.     constructor(){
  12.         super();
  13.         // this.OpRef = React.createRef(); 这是第三种写法
  14.         this.OpRef = null;
  15.         this.myTfRef = React.createRef(); // 测试获取函数中的ref [使用场景较少]
  16.     }
  17.     render(){
  18.         return (
  19.             <section>

  20.                 {/* <p id={'p1'} >这是主体</p> */}
  21.                 {/* <p ref={'pp'} >这是主体</p> */}
  22.                 {/* <p ref={this.OpRef} >这是主体</p> */}
  23.                 <p ref={(arg)=>{ this.OpRef = arg }} >这是主体</p>

  24.                 <button onClick={()=>{ this.btnFn() }} > 点击获取桌面元素 </button>
  25.                
  26.                 <TF ref={this.myTfRef} ></TF>
  27.                 <button onClick={()=>{ this.btnFn2() }} > 点击获取函数组件中的REF </button>
  28.             </section>
  29.         )
  30.     }



  31.     btnFn(){
  32.         // let Op1 = document.getElementById('p1');  // 第一种 通过传统的Id获取 渲染后的页面元素 【不推荐】  
  33.         // let Op1 = this.refs.pp; // 第二种 通过传统的ref 字符串模式 获取 渲染后的页面元素 【实际上到了18的时候 这个就直接报错了 我根本没跑起来 不过也不在意 反正不推荐用了】
  34.         // let Op1 = this.OpRef.current;   // 第三种 ,利用createRef() 创建对象,然后把这个对象传递给ref [注意这个对象会在 ref对象的current 中] 【推荐】  
  35.         // let Op1 = this.OpRef;   // 这是第四种 ,利用 ref传递回调函数,且ref函数会自动执行,且默认传递参数是ref所在元素本身 ; 【推荐】  
  36.         // ref获取  如果是元素,那就会获取元素本身;
  37.         // ref获取 如果是类组件,那就会获取到类;
  38.         // ref获取  如果是函数组件 那什么都拿不到  除非使用 React.forwardRef()方法创建的组件

  39.         // Op1.innerHTML = '除四害';
  40.         // console.log(Op1)

  41.     }


  42.     btnFn2(){
  43.         console.log(this.myTfRef.current)
  44.     }
  45. }




  46. export default NewRef;

复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表