Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Markdown to JSX包在React组件内将标记转换为HTML';s渲染函数_Javascript_Html_Reactjs_Markdown_Markup - Fatal编程技术网

Javascript 使用Markdown to JSX包在React组件内将标记转换为HTML';s渲染函数

Javascript 使用Markdown to JSX包在React组件内将标记转换为HTML';s渲染函数,javascript,html,reactjs,markdown,markup,Javascript,Html,Reactjs,Markdown,Markup,我正在从API中提取JSON数据。JSON包含来自社交媒体网站Steemit.com的博客文章。文章在标记中,我想从API中获取标记,将其转换为常规HTML,并将其显示在React组件中 这是我的渲染函数。API数据在componentDidMount中调用,由深度嵌套的对象组成。请原谅我的混乱 render() { const posts = Object.keys(this.state.myPosts); let page = posts.map((post, i) =&g

我正在从API中提取JSON数据。JSON包含来自社交媒体网站Steemit.com的博客文章。文章在标记中,我想从API中获取标记,将其转换为常规HTML,并将其显示在React组件中

这是我的渲染函数。API数据在
componentDidMount
中调用,由深度嵌套的对象组成。请原谅我的混乱

render() {
    const posts = Object.keys(this.state.myPosts);

    let page = posts.map((post, i) => {
      return (
        this.state.myPosts[posts[i]]["category"] === "utopian-io"
        ?
          <div className="content-container">
            <p>
              <strong>Author: {this.state.myPosts[posts[i]]["author"]}</strong>
            </p>
            <p>
              <strong>Title: {this.state.myPosts[posts[i]]["title"]}</strong>
            </p>
            <p>
              <strong>Payout: {this.state.myPosts[posts[i]]["total_payout_value"]}</strong>
            </p>
            <p>{this.state.myPosts[posts[i]]["created"]}</p>
            <p><span>Category: </span>{this.state.myPosts[posts[i]]["category"]}</p>

            // Successfully renders the markup, but I want to convert this to HTML so it displays as HTML
            <p>{this.state.myPosts[posts[i]]["body"]}</p>

            // I have tried the following but I get a "not a string" console.error or the browser just crashes
            <Markdown>{this.state.myPosts[posts[i]]["body"]}</Markdown>



          </div>
        :
        null

      );
    });

    return (
        <div>
          {page}
        </div>
    );
  }
}
render(){
const posts=Object.keys(this.state.myPosts);
让page=posts.map((post,i)=>{
返回(
this.state.myPosts[posts[i][“category”]=“乌托邦io”
?

作者:{this.state.myPosts[posts[i]][“Author”]}

Title:{this.state.myPosts[posts[i]][“Title”]}

支出:{this.state.myPosts[posts[i]][“总支出值”]}

{this.state.myPosts[posts[i][“created”]}

类别:{this.state.myPosts[posts[i][“Category”]}

//成功呈现标记,但我想将其转换为HTML,使其显示为HTML {this.state.myPosts[posts[i][“body”]}

//我尝试了以下操作,但得到了一个“非字符串”控制台。错误或浏览器崩溃 {this.state.myPosts[posts[i][“body”]} : 无效的 ); }); 返回( {page} ); } }
成功导入了标记为JSX的包,使用
标记调用它是使用它的适当方式。问题是它需要一个字符串,当我传递它时,
this.state.myPosts[posts[I]][“body”]
它将无法工作。我曾尝试使用
toString(
)和
JSON.stringify()
将数据转换为字符串,但我无法解决这个问题

如何将JSON标记数据作为字符串从API传递到JSX


换句话说,我认为将
this.state.myPosts[posts[I]][“body”]
转换为字符串应该可以解决这个问题,但我不知道如何解决这个问题。

选项1:危险的西汀HTML

如果您想在文章正文中插入HTML,请使用危险的HTML

render: function() {
    return (
        <div dangerouslySetInnerHTML={{__html: this.state.myPosts[posts[i]]["body"]}></div>
    );
}
render:function(){
返回(
);
}
您需要使用危险的LysetinerHTML,因为React会逃逸HTML以防止XSS(一种避免注入恶意代码的安全工具)

  • 如果您直接将文章正文转换为字符串,那么您将在正文中添加大量html标记作为字符串,这也是不推荐的
  • 如果您解析标记并希望转换它,那么这将是一项繁重的任务
  • 通常,这种做法是API调用不会返回格式化的标记
选项2:npm库

你不应该失去反应的魔力。因此,这可能是一个很好的选项,可以将您的帖子模式转换为React“post Body”组件


您的结果应该是拥有所有内部组件。通过这种方式,您保留了React的好处,因此从JSON获取标记并显示它并不容易?@NickKinlen检查更新。为您添加了另一个选项,它是一个很好的解析器,用于处理您的情况。