Javascript 如何通过字符串动态创建自定义组件
嗨,我需要帮助我创建自定义组件列表的方法。 该方法对4个组件(包、主题、部分、知识)具有相同的逻辑。我只需要改变一件事,就是我推到列表中的组件 我试过类似的方法,但这是一个奇怪的错误:Javascript 如何通过字符串动态创建自定义组件,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,嗨,我需要帮助我创建自定义组件列表的方法。 该方法对4个组件(包、主题、部分、知识)具有相同的逻辑。我只需要改变一件事,就是我推到列表中的组件 我试过类似的方法,但这是一个奇怪的错误: index.js:1 Warning: <Package /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. React.createElement需要组
index.js:1 Warning: <Package /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.
React.createElement
需要组件类/函数来创建组件,而不是字符串。字符串仅用于创建DOM元素,这些元素必须以小写字母开头
改为这样做:
import Package from '...';
React.createElement(Package, ...);
如果需要参数化元素的创建,可以像其他变量一样传递组件类型。例如,如果您想将makeListOfTypedItems
更改为使用动态组件类型,它可能看起来像这样(抱歉,没有理解原始代码的意图,因此它们可能不是您的意思):
您不应该使用字符串,因为它们不是可摇动的树。这是一个类型安全的解决方案
export type TypedItems = Package | Theme | Part | Knowledges;
export class SubjectDashboardUtils {
static makeListOfTypedItems<T extends TypedItems>(list: any[], itemType: {new(): T; }): (T)[] {
console.log(list);
console.log(itemType);
const items = [];
return list.map((data, key) => {
return React.createElement(itemType, {key, data})
});
}
}
// Use it like so
const packages = SubjectDashboardUtils.makeListOfTypedItems(['data'], Package);
const parts = SubjectDashboardUtils.makeListOfTypedItems(['data'], Part);
导出类型TypedItems=包|主题|部分|知识;
导出类主题DashboardUtils{
静态makeListOfTypedItems(列表:any[],itemType:{new():T;}):(T)[]{
控制台日志(列表);
console.log(itemType);
常量项=[];
返回列表.map((数据,键)=>{
return React.createElement(itemType,{key,data})
});
}
}
//像这样使用它
const packages=SubjectDashboardUtils.makeListOfTypedItems(['data'],Package);
const parts=SubjectDashboardUtils.makeListOfTypedItems(['data'],Part);
这样做的好处是继承类型安全性。你甚至可能有一种类型的
列表
不存在,但对于这一点,我对React了解不够。这并不能解决我的问题。在上面的方法中,我通过参数获取itemType。这是字符串(包、主题、部分、知识),我必须使用此字符串创建组件还有其他方法吗?我知道我可以使用switch,但我希望有更好的方法为什么必须使用字符串创建?您不能将组件类型作为参数传递吗?我还没有测试过,但类似于我的编辑可能会起作用。我无法做到这一点:/尤其是带有导出类型的零件。。。。我收到此错误:``类型为'typeof Package'的参数不可分配给类型为'Package'的参数。`类型为'typeof Package'的参数缺少类型为'ThemePartKnowledge'的以下属性:状态、组件更新、呈现、上下文等。TS
我已经更新了类型,我在那里有一两分钟的错误
import { ComponentType } from 'react';
// ...
export class SubjectDashboardUtils {
static makeListOfTypedItems<
DataType,
Cmp extends ComponentType<{ data: DataType }>
>(list: Array<DataType>, DynamicComponent: Cmp) {
return list.map((item, key) => <DynamicComponent key={key} data={item}/>);
}
}
SubjectDashboardUtils.makeListOfTypedItems(items, Package);
export type TypedItems = Package | Theme | Part | Knowledges;
export class SubjectDashboardUtils {
static makeListOfTypedItems<T extends TypedItems>(list: any[], itemType: {new(): T; }): (T)[] {
console.log(list);
console.log(itemType);
const items = [];
return list.map((data, key) => {
return React.createElement(itemType, {key, data})
});
}
}
// Use it like so
const packages = SubjectDashboardUtils.makeListOfTypedItems(['data'], Package);
const parts = SubjectDashboardUtils.makeListOfTypedItems(['data'], Part);