react 组件 进阶之 ref (ts 版本)

简介: 如果ref的值发生了变动(旧的函数被新的函数替代),分别调用旧的函数以及新的函数,时间点出现在componentDidUpdate之前

含义以及使用方法


ref (reference)是引用,在 vue 中是用于或者真实的dom, 那么在react 中,ref 的作用是啥呢?


场景:希望直接使用dom元素中的某个方法,或者希望直接使用自定义组件中的某个方法


20210226104931431.png


ref作用于内置的html组件


ref作用于内置的html组件,得到的将是真实的dom对象


使用string 方式


import React, { Component } from 'react'
export default class TestRef extends Component {
  // 组件挂载完成后打印this
  componentWillMount() {
    // 可以通过this.refs.属性名来进行获取
    console.log(this);   
  }
  render() {
    return (
      <div ref='test'>
        <h1>234234324</h1>
      </div>
    )
  }
}

20210226105237973.png


注意:string 类型的已经过时了哦,不建议使用哦


20210226112022761.png


使用函数方式


函数的调用时间:


1.componentDidMount的时候会调用该函数

  1.在componentDidMount事件中可以使用ref


2.如果ref的值发生了变动(旧的函数被新的函数替代),分别调用旧的函数以及新的函数,时间点出现在componentDidUpdate之前

  1.旧的函数被调用时,传递null

  2.新的函数被调用时,传递对象


3.如果ref所在的组件被卸载,会调用函数


import React, { Component } from 'react'
export default class TestRef extends Component {
  // 组件挂载完成后打印this
  componentWillMount() {
    // 这里的this.refs里面是没有任何东西的
    console.log(this);   
  }
  render() {
    return (
      <div ref={(el) => {
      // 这里可以获取到ref绑定dom 元素,前提是ref 是作用在react 内置组件的。
        console.log(el)
      }}>
        <h1>234234324</h1>
      </div>
    )
  }
}


效果:


2021022611142197.png


注意:我上面直接在ref 后面绑定的函数不太建议使用哦,原因是每一次渲染(render)或者说是每一次 使用 this.setState({}) 都会创建一个匿名函数,并且进行执行。


20210226141458683.png

20210226141602612.png


解决办法是,直接定义一个函数来进行绑定,就不会出现这个问题的,


20210226141834757.png


结果:


20210226141954613.png


使用react对象方式


需要使用 React.createRef() 这个方式来定义一个对象


样例:


import React, { Component } from 'react'
export default class TestRef extends Component {
// 定义一个对象的属性,类型是react的对象
  private getRef:React.RefObject<HTMLDivElement>;
  constructor(props:{}){
    super(props);
    this.getRef = React.createRef();
  }
  // 组件挂载完成后打印this
  componentDidMount() {
    // 可以通过this.getRef.current  属性名来进行获取
    console.log(this); 
  }
  render() {
    return (
      <div ref={this.getRef}>
        <h1>234234324</h1>
      </div>
    )
  }
}


结果:


20210226164859236.png


从这个结果来看,我们发现,getRef 是一个普通对象,那么我们手动定义一个对象可以么?

答案是可以的哦?


20210226165215118.png

20210226165258519.png


总的来说,ref 需要使用的最好方式是 直接在属性中定义函数或者 属性来进行赋值,这样的效率最好


ref作用于类组件,得到的将是类的实例


我们知道 上面所说的 react 的内置组件 如 div, ul, li 等普通的html元素获取到的是真实的


样例代码


import React, { Component } from 'react'
interface IProp<T> {
  msg: string,
  ref: React.RefObject<T>
}
// 定义A组件
class A extends Component<IProp<A>> {
  render(){
    return <h1>{this.props.msg}</h1>
  }
}
export default class TestRef extends Component {
  private getRef:React.RefObject<A> = React.createRef();
  // 组件挂载完成后打印this
  componentDidMount() {
    // 可以通过this.getRef.current  属性名来进行获取 实列对象
    console.log(this); 
  }
  render() {
    return (
      <div>
       <A msg={'2r3242344'} ref={this.getRef}></A>
      </div>
    )
  }
}


结果:


2021022617260475.png


ref不能直接作用于函数组件


函数是没有实例,没有声明周期,ref 不能直接作用于函数组件,如果需要,那么需要使用ref 转发


20210226173553650.png


总结 何时使用 Refs


下面是几个适合使用 refs 的情况:


  • 管理焦点,文本选择或媒体播放。
  • 触发强制动画。
  • 集成第三方 DOM 库。
  • 避免使用 refs 来做任何可以通过声明式实现来完成的事情。
相关文章
|
前端开发
vue+ts或者react+ts如何使用animate.css
vue+ts或者react+ts如何使用animate.css
274 0
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
319 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
前端开发
React使用useRef ts 报错
【8月更文挑战第17天】
333 4
|
前端开发 开发者 UED
React 18 与之前版本的主要区别
【10月更文挑战第12天】 总的来说,React 18 的这些区别体现了 React 团队对于提升应用性能、用户体验和开发效率的持续努力。开发者需要适应这些变化,充分利用新特性来构建更出色的应用。同时,随着技术的不断发展,React 也将继续演进,为开发者带来更多的创新和便利。
830 58
|
前端开发
react学习(17)回调形式的ref
react学习(17)回调形式的ref
218 9
|
资源调度 JavaScript 前端开发
使用vite+react+ts+Ant Design开发后台管理项目(二)
使用vite+react+ts+Ant Design开发后台管理项目(二)
|
存储 前端开发 容器
react学习(18)createRef形式的ref
react学习(18)createRef形式的ref
159 5
|
前端开发 C++
使用 Vite 创建 React+TS+SW 项目并整合 AntDesign 、Scss 等组件或插件
本文记录了如何使用Vite创建一个React+TypeScript+Service Workers(SW)项目,并整合AntDesign组件库和Scss等插件,包括项目的创建、配置问题解决、AntDesign和Scss的整合方法。
1232 1
|
前端开发 知识图谱
[译] React 中的 "最新 Ref 模式"
[译] React 中的 "最新 Ref 模式"
|
前端开发 JavaScript 开发者
React Hooks 是在 React 16.8 版本中引入的一种新功能
【5月更文挑战第28天】React Hooks 是在 React 16.8 版本中引入的一种新功能
301 1