如何在反应中有条件地延迟加载动态导入?
How to conditionally lazy load dynamic imports in react?
我想仅在加载图像后触发 React 组件的动态导入以优先进行首次绘制。问题是,它是一个上下文提供程序组件,因此遇到了一些麻烦。
所以我在文件 auth.js
:
中有一个动态导入
const AuthContextPreloader = hasWindow
? lazy(() => import("./AuthContextPreloader"))
: null;
我在单独的组件中有一张图片:
<img
ref={() => hasWindow && imageLoaded()}
className={styles.optionsImageImg}
alt={"nav"}
src={didLoad && thumb.jpg}
type="image/jpeg"
/>
一旦加载,我就会在组件树上发送一个状态以传递给 AuthContextPreloader
const imageLoaded = () => {
setheroLoaded(true);
};
一些伪代码来尝试在 auth.js
中实现这一点:
useEffect(() => {
props.heroLoaded && **trigger the lazyload**;
}, [props.heroLoaded]);
但完全不确定如何实施。谢谢。
您不必担心何时加载您的组件。您应该关心 何时 渲染它。类似的东西:
const AuthContextPreloader = hasWindow
? lazy(() => import("./AuthContextPreloader"))
: null;
function ComponentWhereWouldBeRenderedAuthContextPreloader(props) {
return props.heroLoaded ? <Suspense><AuthContextPreloader /> </Suspense> : null;
}
这样你就不会考虑自己的内部结构,而是呈现你当前的应用程序状态。
编辑
从评论中可以清楚地看出,您关心的不是组件本身,而是很大的依赖性。
在这种情况下,您可以这样做:
function ComponentWhereWouldBeRenderedAuthContextPreloader(props) {
return props.heroLoaded ? <AuthContextPreloader /> : null;
}
function AuthContextPreloader(props) {
let [dependencyState, setDependencyState] = useState("not_loaded");
useEffect(function () {
import("large-dependency")
.then(function (module) {
// return either default, or named exports that you need, or skip this step
return module.default;
})
.then(function (dep) {
// do something with dependency and then change state
setDependencyState("loaded");
});
}, []);
if (depenencyState === "not_loaded") return null;
return ...;
}
我想仅在加载图像后触发 React 组件的动态导入以优先进行首次绘制。问题是,它是一个上下文提供程序组件,因此遇到了一些麻烦。
所以我在文件 auth.js
:
const AuthContextPreloader = hasWindow
? lazy(() => import("./AuthContextPreloader"))
: null;
我在单独的组件中有一张图片:
<img
ref={() => hasWindow && imageLoaded()}
className={styles.optionsImageImg}
alt={"nav"}
src={didLoad && thumb.jpg}
type="image/jpeg"
/>
一旦加载,我就会在组件树上发送一个状态以传递给 AuthContextPreloader
const imageLoaded = () => {
setheroLoaded(true);
};
一些伪代码来尝试在 auth.js
中实现这一点:
useEffect(() => {
props.heroLoaded && **trigger the lazyload**;
}, [props.heroLoaded]);
但完全不确定如何实施。谢谢。
您不必担心何时加载您的组件。您应该关心 何时 渲染它。类似的东西:
const AuthContextPreloader = hasWindow
? lazy(() => import("./AuthContextPreloader"))
: null;
function ComponentWhereWouldBeRenderedAuthContextPreloader(props) {
return props.heroLoaded ? <Suspense><AuthContextPreloader /> </Suspense> : null;
}
这样你就不会考虑自己的内部结构,而是呈现你当前的应用程序状态。
编辑
从评论中可以清楚地看出,您关心的不是组件本身,而是很大的依赖性。
在这种情况下,您可以这样做:
function ComponentWhereWouldBeRenderedAuthContextPreloader(props) {
return props.heroLoaded ? <AuthContextPreloader /> : null;
}
function AuthContextPreloader(props) {
let [dependencyState, setDependencyState] = useState("not_loaded");
useEffect(function () {
import("large-dependency")
.then(function (module) {
// return either default, or named exports that you need, or skip this step
return module.default;
})
.then(function (dep) {
// do something with dependency and then change state
setDependencyState("loaded");
});
}, []);
if (depenencyState === "not_loaded") return null;
return ...;
}