当前,我在其中一个组件中拥有这个:
{someObject.map(obj => (
<div
dangerouslySetInnerHTML={{
__html: obj.text
}}
/>
))}
基本上,我正在将someObject
映射到另一个文件上。结构是这样的:
export default someObject = [
{
obj: "<p>Some text 1.</p>"
},
{
obj: "<p>Some text 2.</p>"
}
]
为了演示,我只是简化内容。但是,我遇到了一个问题,因为我需要在其中一项中使用<Link />
组件。如:
export default someObject = [
{
obj: "<p>Some text 1.</p>"
},
{
obj: "<p>Some text 2.</p>"
},
{
obj: "<p>Some text 2 and <Link to="/someroute">link</Link>.</p>"
}
]
但是,由于整个<p></p>
标签都包裹在dangerouslySetInnerHTML
中,因此无法正常工作。
我只能在链接上使用普通的<a></a>
标签,但这似乎不是一个好的解决方案,因为整个应用程序将重新加载而不是仅转到另一条路由。
要实现此目的还有哪些其他选择?
答案 0 :(得分:3)
为什么不将对象导出为jsx对象?我认为使用dangerouslySetInnerHTML
是一种不好的做法,它可能会导致XSS攻击。
const someObject = [
{
obj: <p>Some text 1.</p>
},
{
obj: <p>Some text 2.<a href="https://google.com">google</a></p>
}
]
class App extends React.Component {
render(){
return (
<div className="App">
<h1>Hello world</h1>
<h2>Jsx object goes here {someObject[1].obj}</h2>
</div>
)};
}
const rootElement = document.getElementById("container");
ReactDOM.render(<App />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.6.2/react-dom.min.js"></script>
<div id="container">
<!-- This element's contents will be replaced with your component. -->
</div>
答案 1 :(得分:0)
有两种方法可以解决此问题:
这就像一种更通用的方法,您可以使用它来选择代码。 尝试使用此库(https://github.com/tasti/react-linkify/)
这是组件的更简单形式:
import React, {PropTypes} from 'react';
import Linkify from 'react-linkify';
export default class TextWithLink extends React.Component {
constructor(props) {
super(props);
}
render() {
let text = this.props.text;
if(this.props.showLink) {
text = <Linkify properties={{target: '_blank', rel: "nofollow noopener"}}>{text}</Linkify>
}
return (<div>{text}</div>);
}
}
如果要创建超链接(<a>
),则应该具有一个构建元素并返回结果的函数。
示例:
list = {
text: 'hello world',
link: 'www.facebook.com'
}
render函数可能类似于:
buildLink() {
return(
<p>
{list.text}. <a href={list.link}>{list.link}</a>
</p>
);
}
render() {
return (this.buildLink());
}
答案 2 :(得分:-1)
export default someObject = [
{
obj: "<p>Some text 1.</p>"
},
{
obj: "<p>Some text 2.</p>"
},
{
obj: linkto('/someroute')
}
]
linkto将解决您的问题。