Reactjs 如何将带有文本和链接的变量传递到React元素中

Reactjs 如何将带有文本和链接的变量传递到React元素中,reactjs,hyperlink,xss,Reactjs,Hyperlink,Xss,如果我有这样一个React组件: return ( <p>{obj.text}</p> ) obj = { text: 'This is an example string. I would like a [link here].' } buildLink() { return( <p> {obj.text}. <a href={obj.link}>This is a link</a>

如果我有这样一个React组件:

return (
  <p>{obj.text}</p>
)
obj = {
  text: 'This is an example string. I would like a [link here].'
}
buildLink() {
   return(
      <p>
        {obj.text}. <a href={obj.link}>This is a link</a>
      </p>
    );
}

render() {
   return (this.buildLink());
}
是我使用和传递HTML的唯一途径吗

虽然在这种特殊情况下,这可能不会造成伤害,但随着时间的推移,我可以看到开发人员在
obj.text
中引入变量的可能性,用户可能会突然输入恶意代码


有更简洁的解决方案吗?

如果你想将某个东西设置为HTML,那么危险的是,HTML就是这样做的方法。如果您正在使用的HTML不是您完全可以控制的东西,而是类似于用户输入的东西,那么您应该始终对其进行解析,以确保它不是恶意的

如果您想创建一个超链接,那么另一种可能是使用一个函数来构建元素并返回该元素。例如:

obj = {
  text: 'This is an example string.',
  link: 'www.TastyPotatoes.com'
}
渲染函数可以是这样的:

return (
  <p>{obj.text}</p>
)
obj = {
  text: 'This is an example string. I would like a [link here].'
}
buildLink() {
   return(
      <p>
        {obj.text}. <a href={obj.link}>This is a link</a>
      </p>
    );
}

render() {
   return (this.buildLink());
}
buildLink(){
返回(

{obj.text}。

); } render(){ 返回(this.buildLink()); }

这样你就不会使用危险的HTML。最后,如果您必须直接将某个内容设置为HTML,请始终首先对其进行解析以确保其安全。

如果您希望将某个内容设置为HTML,那么危险的是,HTML是实现此目的的方法。如果您正在使用的HTML不是您完全可以控制的东西,而是类似于用户输入的东西,那么您应该始终对其进行解析,以确保它不是恶意的

如果您想创建一个超链接,那么另一种可能是使用一个函数来构建元素并返回该元素。例如:

obj = {
  text: 'This is an example string.',
  link: 'www.TastyPotatoes.com'
}
渲染函数可以是这样的:

return (
  <p>{obj.text}</p>
)
obj = {
  text: 'This is an example string. I would like a [link here].'
}
buildLink() {
   return(
      <p>
        {obj.text}. <a href={obj.link}>This is a link</a>
      </p>
    );
}

render() {
   return (this.buildLink());
}
buildLink(){
返回(

{obj.text}。

); } render(){ 返回(this.buildLink()); }

这样你就不会使用危险的HTML。最后,如果您必须直接将某些内容设置为HTML,请始终首先对其进行解析以确保其安全。

如果您想创建一个专门用于此用例的组件,那么@Jayce444建议的方法是正确的

但如果您想要一种更通用的方法,那么您可以选择像React Linkyfy()这样的库

我在我的一个项目中使用过它,它对我来说非常有用

下面是我正在使用的组件的简单形式

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>);
    }
}
import React,{PropTypes}来自'React';
从“react Linkify”导入Linkify;
导出默认类TextWithLink扩展React.Component{
建造师(道具){
超级(道具);
}
render(){
让text=this.props.text;
if(this.props.showLink){
text={text}
}
返回({text});
}
}

如果您想为这个用例创建一个组件,那么@Jayce444建议的方法是正确的

但如果您想要一种更通用的方法,那么您可以选择像React Linkyfy()这样的库

我在我的一个项目中使用过它,它对我来说非常有用

下面是我正在使用的组件的简单形式

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>);
    }
}
import React,{PropTypes}来自'React';
从“react Linkify”导入Linkify;
导出默认类TextWithLink扩展React.Component{
建造师(道具){
超级(道具);
}
render(){
让text=this.props.text;
if(this.props.showLink){
text={text}
}
返回({text});
}
}

Yeah看起来拥有某种基本解析器(有点像你建议的)可能是实现go的唯一途径Yeah看起来拥有某种基本解析器(有点像你建议的)可能是唯一途径