import React, { FC, Suspense } from 'react';
const WithSuspense =
(Component: FC, fallback: React.ReactNode = null) =>
(props: any) => {
return (
<Suspense fallback={fallback}>
<Component {...props} />
</Suspense>
);
};
export default WithSuspense;
import React, { FC, Suspense } from 'react';
const WithSuspense =
<T extends {}>(Component: FC, fallback: React.ReactNode = null) =>
(props: T) => {
return (
<Suspense fallback={fallback}>
<Component {...props} />
</Suspense>
);
};
export default WithSuspense;
import { FC, ReactNode, Suspense, useState } from 'react';
export type Test1 = {
test: boolean;
};
const WithSuspense = <T extends {}>(Component: FC<T>, fallback?: ReactNode): FC<Omit<T, keyof Test1>> => {
const WrappedComponent = ({ ...targetComponentProps }) => {
const [test, setTest] = useState(false);
return (
<Suspense fallback={fallback}>
<Component {...(targetComponentProps as T)} test={test} />
</Suspense>
);
};
return WrappedComponent;
};
export default WithSuspense;
-- Usage --
// Step 1.
import WithSuspense, { Test1 } from 'hocs/WithSuspense';
import { FC } from 'react';
interface ITableList extends Test1 {
data: React.ReactNode[];
}
const TableList: FC<ITableList> = ({ data, test }) => {
console.log(test);
if (data.length === 0) return null;
return <div>TEST</div>;
};
export default WithSuspense(TableList);
// Step 2.
<TableList data={[]} />
P.S. any Type 방식 사용해도 위와 동일하게 사용 가능, 조금 더 명시적으로 하기 위해 타입 추론 추가
import React, { FC, Suspense, useState } from 'react';
export type Test1 = {
test: boolean;
};
const WithSuspense = (fallback?:React.ReactNode) => <T extends {}>(Component: FC<T>): FC<Omit<T, keyof Test1>> => {
const WrappedComponent = ({ ...targetComponentProps }) => {
const [test, setTest] = useState(false);
return (
<Suspense fallback={fallback}>
<Component {...(targetComponentProps as T)} test={test} />
</Suspense>
);
};
return WrappedComponent;
};
export default WithSuspense;
-- Usage --
// Step 1.
import WithSuspense from 'hocs/WithSuspense';
import { FC } from 'react';
interface ITableList {
data: React.ReactNode[];
}
const TableList: FC<ITableList> = ({ data }) => {
console.log(test);
if (data.length === 0) return null;
return <div>TEST</div>;
};
export default WithSuspense(<div>Loading...</div>)(TableList);
// Step 2.
<TableList data={[]} />