【问题标题】:Render Markdown In Vue JS在 Vue JS 中渲染 Markdown
【发布时间】:2021-11-10 22:16:07
【问题描述】:

我用 Vue JS 写了一个小博客,用标题和描述呈现帖子。我希望能够在描述中使用降价,所以我使用了npm install marked 当我在数据中硬编码文本时它工作正常,但试图传递我的描述本身来自道具,它不起作用。 请参阅下面的代码,我评论了哪些不起作用,并以硬编码数据为例。 知道如何解决这个问题吗?谢谢!

<template>
  <div class="til-list">
    <div v-for="til in tils" :key="til">
      <div class="til">
        <h3>{{ til.title }}</h3>
        <p>{{ til.description }}</p>
        <div v-html="markdownToHtml"></div>
        <!-- <div v-html="markdownToHtml(til.description)"></div> -->
        <span v-for="tag in til.tags" :key="tag"> #{{ tag }} </span>
      </div>
    </div>
  </div>
</template>

<script>
import marked from "marked";

export default {
  props: ["tils"],
  // computed: {
  //   markdownToHtml(description) {
  //     return marked(this.description);
  //   },
  // },
  data() {
    return {
      markdown: "# Hello World",
    };
  },
  computed: {
    markdownToHtml() {
      return marked(this.markdown);
    },
  },
};
</script>

【问题讨论】:

    标签: javascript vue.js markdown vue-props


    【解决方案1】:

    尝试使用methods 而不是computed 属性:

    new Vue({
      el: '#demo',
      //props: ["tils"],
      data() {
        return {
          tils: [{title: 'title 1', description: '<b>text</b>'}, {title: 'title 2', description: '<i>text</i>'}]
        };
      },
      methods: {
        markdownToHtml(description) {
          return marked(description);
        },
      }
    
    })
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
    <div id="demo">
      <div class="til-list">
        <div v-for="(til, index) in tils" :key="index">
          <div class="til">
            <h3>{{ til.title }}</h3>
            <p>{{ til.description }}</p>
            <div v-html="markdownToHtml(til.description)"></div>
            <!--<span v-for="tag in til.tags" :key="tag"> #{{ tag }} </span>-->
          </div>
        </div>
      </div>
    </div>

    【讨论】:

      【解决方案2】:

      可以在纯 javascript 中尝试以下简单的解析器。 文档和详细信息可以在https://github.com/casualwriter/powerpage-md-document找到

      //=== simple markdown parser
      function simpleMarkdown(mdText) {
      
        // first, handle syntax for code-block
        mdText = mdText.replace(/\r\n/g, '\n')
        mdText = mdText.replace(/\n~~~ *(.*?)\n([\s\S]*?)\n~~~/g, '<pre><code title="$1">$2</code></pre>' )
        mdText = mdText.replace(/\n``` *(.*?)\n([\s\S]*?)\n```/g, '<pre><code title="$1">$2</code></pre>' )
        
        // split by "pre>", skip for code-block and process normal text
        var mdHTML = ''
        var mdCode = mdText.split( 'pre>')
      
        for (var i=0; i<mdCode.length; i++) {
          if ( mdCode[i].substr(-2) == '</' ) {
            mdHTML += '<pre>' + mdCode[i] + 'pre>'
          } else {
            mdHTML += mdCode[i].replace(/(.*)<$/, '$1')
              .replace(/^##### (.*?)\s*#*$/gm, '<h5>$1</h5>')
              .replace(/^#### (.*?)\s*#*$/gm, '<h4 id="$1">$1</h4>')
              .replace(/^### (.*?)\s*#*$/gm, '<h3 id="$1">$1</h3>')
              .replace(/^## (.*?)\s*#*$/gm, '<h2 id="$1">$1</h2>')
              .replace(/^# (.*?)\s*#*$/gm, '<h1 id="$1">$1</h1>')    
              .replace(/^-{3,}|^\_{3,}|^\*{3,}/gm, '<hr/>')    
              .replace(/``(.*?)``/gm, '<code>$1</code>' )
              .replace(/`(.*?)`/gm, '<code>$1</code>' )
              .replace(/^\>> (.*$)/gm, '<blockquote><blockquote>$1</blockquote></blockquote>')
              .replace(/^\> (.*$)/gm, '<blockquote>$1</blockquote>')
              .replace(/<\/blockquote\>\n<blockquote\>/g, '\n<br>' )
              .replace(/<\/blockquote\>\n<br\><blockquote\>/g, '\n<br>' )
              .replace(/!\[(.*?)\]\((.*?) "(.*?)"\)/gm, '<img alt="$1" src="$2" $3 />')
              .replace(/!\[(.*?)\]\((.*?)\)/gm, '<img alt="$1" src="$2" />')
              .replace(/\[(.*?)\]\((.*?) "(.*?)"\)/gm, '<a href="$2" title="$3">$1</a>')
              .replace(/<http(.*?)\>/gm, '<a href="http$1">http$1</a>')
              .replace(/\[(.*?)\]\(\)/gm, '<a href="$1">$1</a>')
              .replace(/\[(.*?)\]\((.*?)\)/gm, '<a href="$2">$1</a>')
              .replace(/^[\*|+|-][ |.](.*)/gm, '<ul><li>$1</li></ul>' ).replace(/<\/ul\>\n<ul\>/g, '\n' )
              .replace(/^\d[ |.](.*)/gm, '<ol><li>$1</li></ol>' ).replace(/<\/ol\>\n<ol\>/g, '\n' )
              .replace(/\*\*\*(.*)\*\*\*/gm, '<b><em>$1</em></b>')
              .replace(/\*\*(.*)\*\*/gm, '<b>$1</b>')
              .replace(/\*([\w \d]*)\*/gm, '<em>$1</em>')
              .replace(/___(.*)___/gm, '<b><em>$1</em></b>')
              .replace(/__(.*)__/gm, '<u>$1</u>')
              .replace(/_([\w \d]*)_/gm, '<em>$1</em>')
              .replace(/~~(.*)~~/gm, '<del>$1</del>')
              .replace(/\^\^(.*)\^\^/gm, '<ins>$1</ins>')
              .replace(/ +\n/g, '\n<br/>')
              .replace(/\n\s*\n/g, '\n<p>\n')
              .replace(/^ {4,10}(.*)/gm, '<pre><code>$1</code></pre>' )
              .replace(/^\t(.*)/gm, '<pre><code>$1</code></pre>' )
              .replace(/<\/code\><\/pre\>\n<pre\><code\>/g, '\n' )
              .replace(/\\([`_\\\*\+\-\.\(\)\[\]\{\}])/gm, '$1' )
          }  
        }
        
        return mdHTML.trim()
      }
      

      【讨论】:

        猜你喜欢
        • 2019-12-06
        • 2016-12-16
        • 2021-04-09
        • 2018-08-10
        • 1970-01-01
        • 2023-04-10
        • 2017-03-28
        • 2021-06-01
        • 2019-05-30
        相关资源
        最近更新 更多