react进阶之refs转发(ts 版本)

简介: 我们知道,函数组件是没有状态的。因此,我们想想获取函数组件,不能是在类组件中那么使用,那么,如果我们想获取函数组件内部的dom 或者react 元素呢? 此时,我们就需要使用ref转发了.

ref 的基本使用方法我们在上一篇博客中讲了,但是在上一篇中还遗留了一个问题,就是函数组件,如果我想使用ref,这个怎么操作?在问一个问题,我们在函数组件中通过ref想获取啥?—— dom、react 对象?带着这些问题来阅读下面的文章


refs 在函数组件的作用


我们知道,函数组件是没有状态的。因此,我们想想获取函数组件,不能是在类组件中那么使用,那么,如果我们想获取函数组件内部的dom 或者react 元素呢? 此时,我们就需要使用ref转发了.


使用方法


ref转发 最关键的是在于转发, 必须需要使用 React.forwardRef() 这个内置的高阶组件,这个高阶组件返回一个新的组件,在调用原组件的时候,需要通过高阶组件包裹的新组件来实现


函数组件使用ref 转发


案例:


import React, { Component } from 'react'
interface IAP {
  msg: string,
}
// 在使用ref 转发的时候,会默认传递两个参数,第一个是函数组件原有的props,第二个参数是ref
// 如果使用ts 需要注意,第二个参数的的类型。要于下面需要使用ref的类型一致,如下,我们是在h1 元素中使用,那么类型就是 HTMLHeadingElement 
function A (props: IAP, ref: React.Ref<HTMLHeadingElement >){
// 这里拿到的ref 是一个空值,为啥呢? ref 都还没有完成绑定,但是在控制台中没有展开前是null, 展开对象会触发getter 方法,是会有值的。
 console.log(ref);
  return (
    <h1 ref={ref}>{props.msg}</h1>
  )
}
const NewA = React.forwardRef(A);
export default class TestForwardRef extends Component {
// 我们在接收使用的ref,定义也要是相同的类型。但是这里ts 好像不强制要求。我们自己可以人为来规定,避免类型不匹配
  private getRef  = React.createRef<HTMLHeadingElement>();
// 组件完成挂载就打印当前的结果
  componentDidMount() {
  // 这里打印的是获取到的真实的ref 的值
    console.log(this.getRef);
  }
  render() {
    return (
      <div>
      // 需要使用包装过后的组件,传递的参数是和原有组件一致的。
       <NewA msg="我是组件A" ref={this.getRef}></NewA>
      </div>
    )
  }
}


结果:


20210301090811491.png


类组件使用ref 转发


函数组件是在第二个参数中获取ref,那么类组件中怎么获取呢? 因为类组件是没有和函数组件那样传参的。我们仔细想一想,在类组件中我们是可以直接使用ref的,所以对于属性来讲,在转发的时候就不能使用ref 这个原来的属性名了。这里需要注意React.forwardRef里面可以传递一个函数,函数的参数如下:


案列:


import React, { Component } from 'react'
interface IAP {
  // 其他参数
  msg: string,
  // ref转发获取A组件的想要的dom
  forwardRef: React.Ref<HTMLHeadingElement>
}
// 我们知道类组件中,传递参数是从 props 里面来进行传参的,所以这里就通过属性来传递
class A extends Component<IAP> {
  render() {
    console.log(this.props,'------');
    return (
      <h1 ref={this.props.forwardRef}>{this.props.msg}</h1>
    )
  }
}
// 定义转发的参数类型
interface IForwardProp {
   // 其他参数
   msg: string,
}
//   React.forwardRef 里面填写一个函数,函数有两个参数,第一个是默认类组件的props, 第二个参数的ref 转发的对象,这里需要注意 ref 的类型
const NewA = React.forwardRef((props:IForwardProp , ref: React.Ref<HTMLHeadingElement>) => {
  return (<A {...props} forwardRef={ref} />)
})
export default class TestClassForwardRef extends Component {
  // 绑定需要使用的地方,注意类型需要一致
  private getRef = React.createRef<HTMLHeadingElement>();
  componentDidMount() {
    console.log(this.getRef);
  }
  render() {
    return (
      <div>
        // 使用方法
        <NewA msg='我是A类组件' ref={this.getRef}></NewA>
      </div>
    )
  }
}


效果


20210301102130305.png

相关文章
|
6月前
|
前端开发
vue+ts或者react+ts如何使用animate.css
vue+ts或者react+ts如何使用animate.css
94 0
|
3月前
|
前端开发
React使用useRef ts 报错
【8月更文挑战第17天】
67 4
|
1月前
|
前端开发 开发者 UED
React 18 与之前版本的主要区别
【10月更文挑战第12天】 总的来说,React 18 的这些区别体现了 React 团队对于提升应用性能、用户体验和开发效率的持续努力。开发者需要适应这些变化,充分利用新特性来构建更出色的应用。同时,随着技术的不断发展,React 也将继续演进,为开发者带来更多的创新和便利。
|
1月前
|
前端开发 JavaScript API
React Refs
10月更文挑战第10天
11 1
|
2月前
|
资源调度 JavaScript 前端开发
使用vite+react+ts+Ant Design开发后台管理项目(二)
使用vite+react+ts+Ant Design开发后台管理项目(二)
|
3月前
|
前端开发 JavaScript
你对 React 中的 refs 有何理解?
【8月更文挑战第30天】
47 6
|
3月前
|
JavaScript 前端开发 容器
React组件属性refs(七)
【8月更文挑战第14天】React组件属性refs(七)
51 0
React组件属性refs(七)
|
3月前
|
前端开发 C++
使用 Vite 创建 React+TS+SW 项目并整合 AntDesign 、Scss 等组件或插件
本文记录了如何使用Vite创建一个React+TypeScript+Service Workers(SW)项目,并整合AntDesign组件库和Scss等插件,包括项目的创建、配置问题解决、AntDesign和Scss的整合方法。
258 1
|
4月前
|
存储 前端开发 JavaScript
react hooks 学习进阶
【7月更文挑战第12天】 React Hooks(自16.8版起)让函数组件能处理状态和副作用。useState用于添加状态管理,useEffect处理副作用,useContext共享数据,useReducer处理复杂状态逻辑,useRef获取引用。进阶技巧涉及性能优化,如useMemo和useCallback,以及遵循规则避免在不适当位置调用Hooks。理解异步更新机制和结合Redux等库提升应用复杂性管理。持续学习新技巧是关键。
55 0
|
4月前
|
前端开发 JavaScript
react18【系列实用教程】useState —— 声明响应式变量(2024最新版)含useState 的异步更新机制,更新的合并,函数传参获取更新值,不同版本异步更新差异,更新对象和数组
react18【系列实用教程】useState —— 声明响应式变量(2024最新版)含useState 的异步更新机制,更新的合并,函数传参获取更新值,不同版本异步更新差异,更新对象和数组
254 0