【发布时间】:2016-11-07 03:08:18
【问题描述】:
我正在向组件传递一些文本:
<Component
text={`text with <span style={{fontWeight:bold}}>${thisPart}</span> emphasized`}
/>
虽然它肯定行不通,但我想它很好地表明了我的意图。知道如何使它工作吗?
【问题讨论】:
标签: reactjs ecmascript-6
我正在向组件传递一些文本:
<Component
text={`text with <span style={{fontWeight:bold}}>${thisPart}</span> emphasized`}
/>
虽然它肯定行不通,但我想它很好地表明了我的意图。知道如何使它工作吗?
【问题讨论】:
标签: reactjs ecmascript-6
不要为此使用dangerouslySetInnerHTML。这是一种反模式。
<MyComponent>
<span>text with</span>
<strong>{thisPart}</strong>
<span>emphasized</span>
</MyComponent>
2 个span 和1 个strong 元素可通过MyComponent children 属性访问
class MyComponent extends React.Component {
render () {
return (
<div>
<p>some text</p>
<p>{this.props.children}</p>
</div>
)
}
}
会渲染
<div>
<p>some text</p>
<p>
<span>text with</span>
<strong>this part</strong>
<span>emphasized</span>
</p>
</div>
【讨论】:
您不能将字符串化的 HTML 传递给组件,因为它会打开 XSS 漏洞。
如果您必须渲染 html,那么您需要使用 dangerouslySetInnerHTML
dangerouslySetInnerHTML是 React 在浏览器 DOM 中使用 innerHTML 的替代品。一般来说,从代码中设置 HTML 是有风险的,因为很容易无意中将您的用户暴露给跨站点脚本 (XSS) 攻击。所以,你可以直接从 React 中设置 HTML,但你必须输入dangerouslySetInnerHTML并使用 __html 键传递一个对象,以提醒自己这很危险。例如:
function createMarkup() {
return {__html: 'First · Second'};
}
function MyComponent() {
return <div dangerouslySetInnerHTML={createMarkup()} />;
}
【讨论】: