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


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

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

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

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

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

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

  • 相关阅读:
    shell脚本将执行结果重定向到指定路径指定文件对应的变量
    基于C++的车辆装甲板检测自瞄系统
    2022-08-19 Mysql--数据库事务
    设计一个简单HTML爵士音乐网页(HTML+CSS)
    Linux——页面置换算法(OPT、FIFO、LRU的实现与比较)
    前端如何用mockjs插件模拟接口调用
    前端导出下载文件后提示无法打开文件
    excel表格在线编辑(开源版)
    【linux】权限的理解
    【Leetcode】 96. 不同的二叉搜索树
  • 原文地址:https://blog.csdn.net/m0_64130892/article/details/134211995