解决 React forwardRef 与 TypeScript 泛型组件冲突的问题

本文主要是介绍解决 React forwardRef 与 TypeScript 泛型组件冲突的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        forwardRef是一个可以将组件内的ref对外暴露的高阶组件,当你的组件需要对外暴露元素的Ref,或者想对外暴露某些内部方法,就可以使用这个 (对应vue3的 expose 方法)

        但是当forwardRef与TypeScript泛型组件结合时,会出现泛型丢失的问题 (传入泛型无效)

        对这个问题,网上有许多解决方法,比如 定义 global.d.ts 等,但是感觉都不够高效,现在给大家带来我的解决方法

        主要思路就是创建一个高阶组件,继承原组件的泛型等类型,同时返回出带有forwardRef 的新组件。

import { ForwardedRef, forwardRef } from "react";
interface myRef<T> {/**用myRef来代替原本的ref  */myRef?: ForwardedRef<T>;
}
/**创建使用forwardref的组件,且保留原组件的泛型。 代价是传递ref,得通过props - myRef* - 使用 forwardRef 包裹后,泛型将丢失,所以多包裹一层,只是为了保留泛型。但是想传递ref就只能通过myRef传递,不能直接使用ref属性 ,因为会报错"ref不是props"* @param originalComponent 原组件,需要两个参数,第一个参数是props,第二个参数是ref。* @template T props的类型* @template D ref的类型* @returns 新组件,可以正常使用泛型* @example* 普通无泛型组件:* const Xxx = myForwardref<propType,refType>(function Xxx(props, ref){ ... }) //此时ref和组件props会自动获得泛型传递的类型** 有泛型的组件就比较麻烦,不能直接传递myForwardref的泛型,而是需要在函数里面自己传递类型:* const Xxx = myForwardref(function Xxx<T>(props: propType<T>, ref: ForwardedRef<refType>){ ... }) //其实就是ts类型的传递方式不同,泛型组件的泛型需要写在里面,才能获取到泛型。且注意需要给refType加上 ForwardedRef<refType>** 需要暴露数据给外部,就:* useImperativeHandle(ref, () => ({ xxxx })); //暴露出内部方法*/
const myForwardref = function <T, D>(originalComponent: (props: T, ref: ForwardedRef<D>) => JSX.Element) {const ForwardRefComponent = forwardRef(originalComponent);ForwardRefComponent.displayName = "ForwardRefComponent";return function NewComponent(props: T & myRef<D>) {return <ForwardRefComponent {...(props as any)} ref={props.myRef} />;};
};
export default myForwardref;

         缺点:由于ref不能作为props传递 (这个名字用了的话,控制台会报错),所以改为 “myRef”,其余用法和普通Ref一模一样。

这篇关于解决 React forwardRef 与 TypeScript 泛型组件冲突的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343324

相关文章

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

JavaWeb 中的 Filter组件详解

《JavaWeb中的Filter组件详解》本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后... 目录JavaWeb 中的 Filter 详解1. Filter 基本概念1.1 什么是 Filter1.