React – 如何在道具中传递HTML标签?
我希望能够传递HTML标签的文本,如下所示:
<MyComponent text="This is <strong>not</strong> working." />
但是在MyComponent
的渲染方法里面,当我打印出this.props.text
,它实际上打印出了一切:
This is <strong>not</strong> working.
有什么办法让ReactparsingHTML并将其正确地转储出去吗?
您可以使用带有string和JSX元素的混合数组(请参阅此处的文档):
<MyComponent text={["This is ", <strong>not</strong>, "working."]} />
这里有一个小提琴,它显示它的工作: http : //jsfiddle.net/7s7dee6L/
此外,作为最后的手段,您始终可以插入原始HTML,但要小心,因为如果不清除属性值,可能会导致跨站点脚本攻击(XSS)攻击。
其实,有很多方法可以解决这个问题。
你想在你的道具里面使用JSX
您可以简单地使用{}来使JSXparsing参数。 唯一的限制与每个JSX元素相同:它只能返回一个根元素。
myProp={<div><SomeComponent>Some String</div>}
最好的可读方法是创build一个renderMyProp函数,它将返回JSX组件(就像标准渲染函数一样),然后简单地调用myProp = {this.renderMyProp()}
你只想传递一个string作为HTML
默认情况下,JSX不允许您从string值中呈现原始HTML。 但是,有一种方法可以做到这一点:
myProp="<div>This is some html</div>"
然后在你的组件中,你可以像这样使用它:
<div dangerouslySetInnerHTML={this.props.myProp}></div>
请注意,这个解决scheme“可以”在跨站点脚本伪造攻击上打开。 另外要注意的是,你只能渲染简单的HTML,没有JSX标签或组件或其他奇特的东西。
arrays的方式
在反应中,您可以传递一个JSX元素的数组。 这意味着:
myProp={["This is html", <span>Some other</span>, "and again some other"]}
它不会推荐这种方法,因为:
- 它会创build一个警告(丢失键)
- 这是不可读的
- 这实际上并不是JSX的方式,它比预期的devise更为黑客。
孩子的方式
为了完整性而添加它,但是在做出反应的同时,还可以获取组件内部的所有孩子。
所以,如果我采取以下代码:
<SomeComponent> <div>Some content</div> <div>Some content</div> </SomeComponent>
然后,这两个div将在SomeComponent中以this.props.childrens的forms提供,并且可以使用标准的{}语法来呈现。
当你只有一个HTML内容传递给你的组件时,这个解决scheme是完美的(设想一个Popin组件只将Popin的内容作为子组件)。
但是,如果您有多个内容,则不能使用子项(或者您至less需要将其与另一个解决scheme组合在一起)
你可以使用危险的SetInnerHTML
只需发送一个普通的string的HTML
<MyComponent text="This is <strong>not</strong> working." />
并在这样的JSX代码中呈现:
<h2 className="header-title-right wow fadeInRight" dangerouslySetInnerHTML={{__html: props.text}} />
如果您正在渲染用户input的数据,请小心。 您可能成为XSS攻击的受害者
这里是文档: https : //facebook.github.io/react/tips/dangerously-set-inner-html.html
<MyComponent text={<span>This is <strong>not</strong> working.</span>} />
然后在你的组件中,你可以这样做prop检查:
import React from 'react'; export default class MyComponent extends React.Component { static get propTypes() { return { text: React.PropTypes.object, // if you always want react components text: React.PropTypes.any, // if you want both text or react components } } }
确保你只select一种道具types。
对我来说,它通过在道具儿童传递HTML标签
<MyComponent>This is <strong>not</strong> working.</MyComponent> var MyComponent = React.createClass({ render: function() { return ( <div>this.props.children</div> ); },
你可以用我知道的两种方法做到这一点。
1- <MyComponent text={<p>This is <strong>not</strong> working.</p>} />
然后做这个
class MyComponent extends React.Component { render () { return (<div>{this.props.text}</div>) } }
或者第二种方法是这样做的
2- <MyComponent><p>This is <strong>not</strong> working.</p><MyComponent/>
然后做这个
class MyComponent extends React.Component { render () { return (<div>{this.props.children}</div>) } }
你也可以使用组件上的函数来通过jsx传递道具。 喜欢:
var MyComponent = React.createClass({ render: function() { return ( <OtherComponent body={this.body} /> ); }, body() { return( <p>This is <strong>now</strong> working.<p> ); } }); var OtherComponent = React.createClass({ propTypes: { body: React.PropTypes.func }, render: function() { return ( <section> {this.props.body()} </section> ); }, });
在我的项目中,我必须从variables传递dynamichtml片段,并将其呈现在组件中。 所以我做了以下。
defaultSelection : { innerHtml: {__html: '<strong>some text</strong>'} }
defaultSelection对象从.js
文件传递给组件
<HtmlSnippet innerHtml={defaultSelection.innerHtml} />
HtmlSnippet组件
var HtmlSnippet = React.createClass({ render: function() { return ( <span dangerouslySetInnerHTML={this.props.innerHtml}></span> ); } });
普朗克例子
对doc进行危险的设置
是的,你可以通过使用混合数组与string和JSX元素。 参考
<MyComponent text={["This is ", <strong>not</strong>, "working."]} />
使用jQuery append在componentDidMount中附加了html。 这应该解决问题。
var MyComponent = React.createClass({ render: function() { return ( <div> </div> ); }, componentDidMount() { $(ReactDOM.findDOMNode(this)).append(this.props.text); } });