gpt4 book ai didi

reactjs - 将 TypeScript 与 React HOC、React.lazy 和 forwarRef 结合使用

转载 作者:行者123 更新时间:2023-12-05 06:54:51 25 4
gpt4 key购买 nike

我想在 TypeScript 中使用 React.lazyReact.Suspense 编写一个包装组件的 HOC,但我不知道如何修复类型错误。

type AsyncComponentFactory<P> = () => Promise<{ default: ComponentType<P> }>;

export function loadable<P>(factory: AsyncComponentFactory<P>): ComponentType<P> {
const LazyComponent = React.lazy(factory);

const WrappedWithLoadableComponent = forwardRef<P>((props: P, ref) => (
<React.Suspense fallback={'loading'}>
<LazyComponent {...props} ref={ref} />
</React.Suspense>
));

WrappedWithLoadableComponent.displayName = 'LazyExoticComponent(loadableComponent)';

return WrappedWithLoadableComponent;
}

const JobsView = loadable(() => import(/* webpackChunkName: "JobsView" */ '@views/Jobs'));

Error

最佳答案

我可能是错的,但我认为这是由于 react 的限制。查看forwardRef的类型:

    function forwardRef<T, P = {}>(render: ForwardRefRenderFunction<T, P>): ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<T>>;

React 需要 PropsWithoutRef 而您正在尝试使用 ref。我认为这是错误的。你应该使用这个例子:

import React, { ForwardRefRenderFunction } from 'react'

type IMyComponentProps = { a: string }
const MyComponentRenderFn: ForwardRefRenderFunction<HTMLDivElement, IMyComponentProps> =
(props, ref) => <div ref={ref}>Hoopla</div>

const MyComponent = React.forwardRef(MyComponentRenderFn);
const myRef = React.createRef<HTMLDivElement>();

<MyComponent a="foo" ref={myRef} />

所有功劳归于此 answer

关于reactjs - 将 TypeScript 与 React HOC、React.lazy 和 forwarRef 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65447359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com