我有一个类似的问题,我通过创建一个<Lazy ... />
组件来解决它。这是我的解决方案,也许它可以帮助你。
import React from "react"
import PleaseWait from "../please-wait"
export default function Lazy<P>(
props: P & {
factory: () => Promise<{ default: (props: P) => JSX.Element }>
}
) {
const { factory } = props
const [element, setElement] = React.useState<JSX.Element | null>(null)
React.useEffect(() => {
setElement(null)
factory().then(mod => setElement(mod.default(props)))
}, [factory])
return <PleaseWait>{element}</PleaseWait>
}
这是我使用它的方式:
<Lazy
factory={() => import("./menu")}
traceMsg={props.myMessage}
/>
"./menu"
我在需求中定义的组件traceMsg
有prop。一旦你写factory={() => import("./menu")}
了,TypeScript 就足够聪明,可以让 VSCode 为你提供智能感知traceMsg
。
至于组件<PleaseWait/>
,这取决于您的需求。就我而言,我有这个:
export interface PleaseWaitViewProps {
className?: string
children?: JSX.Element | JSX.Element[] | string | null
}
export default function PleaseWaitView(props: PleaseWaitViewProps) {
const { children } = props
return (
<div className={getClassNames(props)}>
<div className={`element ${children ? "show" : "hide"}`}>
{children}
</div>
<div className={`fallback ${children ? "hide" : "show"}`}>
{/* Whatever spinning animation you want... */}
</div>
</div>
)
}
当然,这不是一个完美的解决方案,因为最终<div>
您的组件周围有两个。