reactjs - React中如何使用import()动态加载组件?
问题描述
我尝试使用import()
而不是React.lazy
动态加载组件,但是没有用。
应用程序.js
import React, { useState } from 'react';
function App() {
const [Com, setCom] = useState(null);
const handleClick = () => {
import("./A.js").then(c => {
//console.log(c.default)
setCom(c.default)
})
}
return (
<div>
<button onClick={handleClick}>Load</button>
{ Com ? <Com /> : null }
</div>
);
}
export default App;
js
import React from "react";
export default function A () {
return (<div>A</div>)
}
错误:元素类型无效:需要字符串(对于内置组件)或类/函数(对于复合组件),但得到:对象。
事实上,我打印了c.default
. 这真的是一个功能。
c.default
ƒ A() {
return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
__source: {
fileName: _jsxFileName,
lineNumber: 4
},
__self: this
}, "A");
}
解决方案
实际上,它与动态无关,import
而与useState
实现有关。例如:
import Comp from "./A";
function App() {
const [Com, setCom] = useState(Comp);
return (
<div>
<Com />
</div>
);
}
会抛出同样的错误。那是因为当您调用 时useState(Comp)
,Comp
“函数”(即组件)已被执行(您可以测试它<Com />
从代码中删除任何内容,添加console.log
到内部A
。console.log
仍然会发生)。
结果Com
不再是一个组件,而是一个 JSX 元素。当您尝试以函数方式呈现 JSX 元素时(意味着用<
and包装它,会/>
引发此错误。
解决方案要么设置Com
为组件(() => Com
),要么呈现为 JSX 子级({Com}
)
import React, { useState } from "react";
function App() {
const [Com, setCom] = useState(null);
const handleClick = () => {
import("./A.js").then(c => {
//console.log(c.default)
setCom(c.default);
});
};
return (
<div>
<button onClick={handleClick}>Load</button>
{/* <Comp /> */}
{Com}
</div>
);
}
export default App;
https://codesandbox.io/s/answer-for-httpsstackoverflowcomq62125854863110-jj2wu
顺便说一句,您可以通过原始结果和结果看到差异console.dir
import Comp from "./A";
useState(Comp)
import Comp from "./A";
function App() {
const [Com, setCom] = useState(Comp);
// console.log(1, Com, 2, Comp);
console.dir(Com) // Object
console.dir(Comp) // ƒ A()
//...
}
推荐阅读
- haskell - 在 Haskell 中,为什么 GHCi cmd 行允许我更改变量的值,这在从文本文件加载时是不允许的
- php - PHP:当时间格式化为 12:00a 时,strtotime 不起作用
- laravel - 获取后如何将自定义属性推送到雄辩的对象(模型)?
- python - 在python中重写wav文件的问题
- c# - C# 从通用接口解析具体类型
- mysql - 无法将带有多嵌套 json 字符串的 json_extract 用于 MySQL 表
- php - 提取引号之间的单词模式
- android - 使用 Kotlin 以编程方式更改“包含”中的布局
- kotlin - 如何在同步上下文中使用箭头 kt 中的 IO 组合
- javascript - 如何允许将使用 pdfjs 添加图像?