我有一个简单的表示组件,在一个设计精美的盒子里显示文本,即一堆DIV。我的组件需要三个道具:header
,displayText
和isHtml
。
有时候,我需要传递给我的displayText
prop简单文本,有时候传递包含HTML的东西,比如超链接。
例如,我可以将Hello World!
或<a href="http://www.google.com">Click for Google</a>
传递给displayText
道具。每当我将HTML传递给displayText
时,isHtml
都会设置为TRUE
。
我遇到的问题是PropType
设置为string
displayText
,但如果我发送带有HTML标签的文字,那么它就会成为object
而我得到一个错误,说道具得到object
,但期待string
。
我该如何处理这个scneario?
我的组件如下所示:
const MyComponent = ({ header, displayText, isHtml }) => {
const renderHtml = () => {
return { __html: displayText }
}
return (
<div className="my-fancy-classes">
<span className="some-more-fancy-classes">{header}</span>
{isHtml
? <div className="some-class" dangerouslySetInnerHTML={renderHtml()} />
: <div className="some-class">{displayText}</div>
}
</div>
);
}
MyComponent.propTypes = {
header: PropTypes.string.isRequired,
displayText: PropTypes.string.isRequired,
isHtml: PropTypes.bool.isRequired
};
以下是我的组件声明在父JSX
组件IF中发送HTML的内容:
getMyText() {
let displayText = "";
if(this.props.isHtml)
displayText = '<a href="http://www.google.com">Click for Google</a>';
return displayText;
}
...
<div>
<MyComponent header="Title" displayText={this.getMyText()} isHtml={true} />
</div>
如果我发送简单文本,它将如下所示:
<div>
<MyComponent header="Title" displayText={this.props.someProp} isHtml={false} />
</div>
答案 0 :(得分:2)
根据https://facebook.github.io/react/docs/typechecking-with-proptypes.html,你应该使用PropTypes.node
来表示任何可以呈现的内容:
//可以渲染的任何东西:数字,字符串,元素或数组 //(或片段)包含这些类型。 optionalNode:PropTypes.node,
所以你会有
MyComponent.propTypes = {
header: PropTypes.string.isRequired,
displayText: PropTypes.node.isRequired,
isHtml: PropTypes.bool.isRequired
};
如果您想在一个道具中拥有多种类型的PropType,也可以使用oneOfType
修改强>
如果您直接返回JSX,看起来您甚至可能不需要dangerouslySetInnerHTML
等等:
getMyText() {
let displayText = "";
if (this.props.isHtml)
// Remove quotes around html
displayText = <a href="http://www.google.com">Click for Google</a>;
return displayText;
}
-
const MyComponent = ({ header, displayText, isHtml }) => {
return (
<div className="my-fancy-classes">
<span className="some-more-fancy-classes">{header}</span>
<div className="some-class">{displayText}</div>
</div>
);
}
答案 1 :(得分:0)
由于您已将displayText prop定义为string类型,因此它不适用于html对象。你需要像这样定义它。
displayText: PropTypes.any.isRequired,
这里任何一种都可以让你传递displayText prop中的任何类型的内容。