【问题标题】:Use code-prettify with rendered content reactjs使用带有渲染内容的代码美化 reactjs
【发布时间】:2018-12-22 16:29:28
【问题描述】:

我正在使用 reactjs 来渲染帖子。在我的帖子中,我有一些标签<code></code>。 所以我想把code显示给大家方便看。

我用 reactjs 渲染我的帖子。

<div className="post-body" dangerouslySetInnerHTML={{
                    __html: this.state.post.content.rendered
                  }} />

我从这里安装了代码美化。

https://www.npmjs.com/package/code-prettify

那么我该如何使用pretty-code?

这是我的内容渲染 json:

"content": {
        "rendered": "<p>In blogger\/blogspot you can you the conditional tags to make custom for posts, pages, archive page, label and search page, even a specific post.<\/p>\n<h2>I.List of conditional tags you can use in your Blogger theme.<\/h2>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li>For Index page (Homepage, label pages and archive pages)\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.pageType == \"index\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For posts<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.pageType == \"index\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For pages<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.pageType == \"static_page\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For archive pages<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.pageType == \"archive\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For homepage<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.url == data:blog.homepageUrl'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For specific url<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.url == \"PUT_URL_HERE\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For search page<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.searchLabel'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<li>\n<div class=\"toolbar\">For error page<\/div>\n<div class=\"toolbar\"><code class=\"prettyprint\">&lt;b:if cond='data:blog.pageType == \"error_page\"'&gt;<br \/>\n&lt;\/b:if&gt;<\/code><\/div>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2>II. How to use?<\/h2>\n<p>You can use like this:<br \/>\nExample: In home page, I want to make a different style with other pages\/posts. I will use css inside conditional tags.<br \/>\n<code class=\"prettyprint\"><br \/>\n&lt;b:if cond='data:blog.url == data:blog.homepageUrl'&gt;<br \/>\n&lt;style&gt;<br \/>\nbody {font-size:20px; background:#f1f1f1}<br \/>\n&lt;\/style&gt;<br \/>\n&lt;script&gt;<br \/>\n\/\/&lt;![CDATA[<br \/>\n$('body').addClass('homepage')<br \/>\n\/\/]]&gt;<br \/>\n&lt;\/script&gt;<br \/>\n&lt;\/b:if&gt;<br \/>\n<\/code><\/p>\n<p>You also can use else if not homepage.<\/p>\n<p><code class=\"prettyprint\"><br \/>\n&lt;b:if cond='data:blog.url == data:blog.homepageUrl'&gt;<br \/>\n&lt;style&gt;<br \/>\nbody {font-size:20px; background:#f1f1f1}<br \/>\n&lt;\/style&gt;<br \/>\n&lt;script&gt;<br \/>\n\/\/&lt;![CDATA[<br \/>\n$('body').addClass('homepage')<br \/>\n\/\/]]&gt;<br \/>\n&lt;\/script&gt;<\/code><\/p>\n<p>&lt;b:else\/&gt;<br \/>\n&lt;!&#8211; Code for other pages here &#8211;&gt;<br \/>\n&lt;\/b:if&gt;<\/p>\n",
        "protected": false
    },

【问题讨论】:

  • npm page 或 docs page 中是否有您不理解的特定内容?尝试提供minimal reproducible example
  • @Sagivb.g 朋友,不知道reactjs中怎么导入,render后怎么调用?
  • docs 对此很清楚,只需包含脚本并在pre 标签中添加一个类 -> &lt;pre class="prettyprint"&gt;

标签: reactjs google-code-prettify


【解决方案1】:

docs 非常清楚如何使用它,只需包含脚本并将prettyprint 类添加到pre 标记

<pre class="prettyprint">

这是一个运行示例:

const codeFromServer = `<code>
function add(n1,n2){
  console.log(x + y);
}

const x = 8;
const y = 10;

add(x,y);
</code>
`;

class App extends React.Component{
  render(){
    return(
      <pre className="prettyprint" 
      dangerouslySetInnerHTML={{
                    __html: codeFromServer
                  }}></pre>
    );
  }
}

ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />

【讨论】:

  • 就像你做的那样,它行不通。我还想将漂亮代码导入捆绑文件。 Codefromserver 是块代码,它可以包含&lt;code&gt;&lt;/code&gt;。 post.content.rendered 将呈现块代码(html),不仅像您的解释那样简单。
  • 所以也许在这里提供完整的图片并附上您从服务器接收到的数据的示例?顺便说一句,我的示例使用code 标记作为字符串的一部分
  • 您可以在更新的问题中看到 content.rendered from json。
  • 您需要提取code 块或使用prettyprint 类返回它们。话虽如此,从服务器获取html 标记并呈现它是一种非常糟糕的做法。
  • 我使用了“自动运行”脚本版本,有another way to use this 可以让您使用PR.prettyPrint() 按需调用它。至于不好的做法,是的,渲染 HTML 是 risky,这就是为什么 react API 被命名为 dangerouslySetInnerHTML
【解决方案2】:

作为Sagiv b.g mentioned,有一种方法可以按需运行它,例如在页面上呈现就像在下面的代码 sn-p 中一样。还演示了如何动态注入 lib。

class CodePrettyComponent extends Component {
  static getHeadOrBody() {
    return document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0];
  }

  static codePrettify() {
    // Check if PR object already exists
    if (typeof PR !== 'undefined') {
        return;
    }

    // Inject if not
    CodePrettyComponent.getHeadOrBody().appendChild(
      Object.assign(
        document.createElement('script'),
        {
          type: 'text/javascript',
          async: true,
          src: 'https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js'
        }
      )
    );
  }

  componentDidMount() {
    // Injecting lib into document
    CodePrettyComponent.codePrettify();
    
    // Waiting for lib to be loaded and invoke
    setTimeout(() => { PR.prettyPrint(); }, 1500);
  }

  render() {
    return (
      <pre class = "prettyprint" >
        <code class = "language-groovy" >
          <!-- your code here -->
        </code>
      </pre>
    );
  };
};
&lt;script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"&gt;&lt;/script&gt;

要在 React 中渲染 HTML,请使用 html-to-react。使用parseWithInstructions(),您可以过滤掉有潜在风险的候选人。

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多