reactjs - 为什么尝试在变量中渲染组件时会出错?
问题描述
我有一种情况,我想渲染一个默认组件,除非在对象中传递了一个不同的组件。
{map(changes, item => {
const hasChanged = item.fromValue !== item.toValue;
const Component = item.Component;
return (
<div key={uuid.v4()} className="row">
<div className="col-md-6">
{Component ? (
<Component
key={uuid.v4()}
labelColor={hasChanged ? '#AB2912' : ''}
backgroundColor={hasChanged ? '#FFEE7E' : ''}
shouldBoldValue={hasChanged}
label={item.label}
cssClasses="preview-item-padding"
capitalize={false} />
) : (
<SimpleLabelText
key={uuid.v4()}
labelColor={hasChanged ? '#AB2912' : ''}
backgroundColor={hasChanged ? '#FFEE7E' : ''}
shouldBoldValue={hasChanged}
label={item.label}
text={item.toValue}
cssClasses="preview-item-padding"
capitalize={false} />
)}
</div>
</div>
);
})}
SimpleLabelText
在上面的代码中,除非item
对象具有 Component 属性,否则我想渲染。Component
是在不同文件中创建的 jsx 标记。
我不认为这很重要,但这是在另一个文件中创建标签的函数(这是临时的,我稍后会添加东西)
function getCustomComponent(text) {
return (
<SimpleLabelText
text='something'
/>
);
}
但是,当我运行它时,整个事情都爆炸了,我收到了这个错误消息;
警告:React.createElement: type is invalid - 需要一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:。您是否不小心导出了 JSX 文字而不是组件?
如何正确呈现分配给的 jxg 标记Component
?
解决方案
我希望你item.component
是调用的结果getCustomComponent()
。在这里您需要注意getCustomComponent
返回一个对象而不是function
or class
。所以你必须直接渲染它{item.Component}
而不是使用这个 ->< />
表示法。
牢记这一点,您的代码将转换为如下所示。
return (
<div key={uuid.v4()} className="row">
<div className="col-md-6">
{ item.Component ? item.Component : (
<SimpleLabelText
key={uuid.v4()}
labelColor={hasChanged ? '#AB2912' : ''}
backgroundColor={hasChanged ? '#FFEE7E' : ''}
shouldBoldValue={hasChanged}
label={item.label}
text={item.toValue}
cssClasses="preview-item-padding"
capitalize={false} />
)}
</div>
</div>
);
但这并不能完全解决您的问题。您需要通过的道具现在没有通过(如果item.Component
在场)。因此,您可能需要查看React.cloneElement
. 您可以在此处阅读有关它的信息https://reactjs.org/docs/react-api.html#cloneelement和一些在线示例,说明如何将道具传递给您item.Component
并呈现相同的内容。
推荐阅读
- c - 如何始终在崇高的文本中链接数学?
- java - React Native 构建失败 - javax.xml.bind.UnmarshalException:无法创建 com.android.repository.impl.generated.v1.TypeDetails 的实例
- javascript - 在 NodeJS 的画布上用多行居中文本
- node.js - Mongoose - 实例化没有父级的子架构
- java - Spring 数据存储库:列表与流
- python-3.x - 使用 Pandas 读取 excel 文件时如何解决损坏的文件错误
- java - 在 spring 中使用基于 java 的配置而不是 xml 启用绝对排序
- qt - 自定义小部件在 WIdget 窗口中不可见
- java - 在 SpringBoot 应用程序中从缓存中获取时使用 @AutoValue 注释反序列化类
- php - PHP使用for循环插入sql